互联网大厂SQL真题(三)

2023-05-16

题目:近一个月发布的视频中热度最高的top3视频

4e5d0a31908a453787b75a6be052691d.png

790c2e7bd8484aae844243ffcf5df000.png

问题:找出近一个月发布的视频中热度最高的top3视频。

  • 热度=(a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度;
  • 新鲜度=1/(最近无播放天数+1);
  • 当前配置的参数a,b,c,d分别为100、5、3、2。
  • 最近播放日期以end_time-结束观看时间为准,假设为T,则最近一个月按[T-29, T]闭区间统计。
  • 结果中热度保留为整数,并按热度降序排序。

 adae3272b6e647369b05ac2403ddfda9.png

 

 Solution

本题虽然最终只需要求热度这一个指标,但其中热度是一个计算公式,其涉及到了相当多的指标,所以需要分开来一个一个看。根据热度计算公式和给定的表,不难得出最简单的几个指标就是点赞数,评论数和转发数,这三个指标通过简单group by加聚合函数就可以得出。

现在来关注其它指标,首先是视频完播率,通过观察表和给定输出示例可以发现,video_info里的duration单位应该是秒,因此我们可以使用timediff(second, date1, date2)这个函数来判断一个视频是否完播,如果end_time和start_time的差大于等于对应的duration,那么就代表完播。而因为是求完播率,再加上count(video_id)作为分母就行,实际上也就是这里使用avg()就行。该指标代码如下:

select
    avg(if(timediff(SECOND, start_time, end_time)>=duration, 
    1, 0)) as finish_rate
from
    tb_user_video_log
    left join
    tb_video_info
    on tb_user_video_log.video_id = tb_video_info.video_id

接下来是新鲜度指标,由于新鲜度涉及到了无播放天数,所以我们首先得知道一个视频的最近播放日期是多少,也就是max(date(end_time)),这部分代码如下:

select
    max(date(end_time)) as cur_dt
from
    tb_user_video_log

为了求最近无播放天数,我们需要求video_info里的release_time和cur_dt的天数差,此时我们可以将上述代码封装成一个子表,用left join on 1 = 1的方式将该表与其它表连接,此时就可计算出无播放天数。再补充上其它指标,我们可以得出下述代码:

SELECT
            video_id,
            AVG(
                IF(
                    TIMESTAMPDIFF(SECOND, start_time, end_time) >= duration,
                    1,
                    0
                )
            ) as finish_rate,
            SUM(if_like) as like_cnt,
            COUNT(comment_id) as comment_cnt,
            SUM(if_retweet) as retweet_cnt,
            MAX(DATE(end_time)) as recent_end_dt,
            MAX(DATE(release_time)) as release_dt,
             --由于使用了group by,这里需要避免语法错误所以加max
            MAX(cur_dt) as cur_dt 
        FROM
            tb_user_video_log
            JOIN tb_video_info 
            on tb_user_video_log.video_id = tb_video_info.video_id
            LEFT JOIN (
                SELECT
                    MAX(DATE(end_time)) as cur_dt
                FROM
                    tb_user_video_log
            ) as tb_max_dt ON 1 = 1
        GROUP BY
            video_id
        HAVING
            TIMESTAMPDIFF(DAY, release_dt, cur_dt) <= 29

由于题目限定时间为近一个月,所以在group by之后加了一个having条件用于限定时间。

最后,根据热度计算公式,可以得出最终代码如下:

SELECT
    video_id,
    ROUND(
        (
            100 * finish_rate + 5 * like_cnt + 3 * comment_cnt + 2 * retweet_cnt
        ) / (TIMESTAMPDIFF(DAY, recent_end_dt, cur_dt) + 1),
        0
    ) as hot_index
FROM
    (
        SELECT
            video_id,
            AVG(
                IF(
                    TIMESTAMPDIFF(SECOND, start_time, end_time) >= duration,
                    1,
                    0
                )
            ) as finish_rate,
            SUM(if_like) as like_cnt,
            COUNT(comment_id) as comment_cnt,
            SUM(if_retweet) as retweet_cnt,
            MAX(DATE(end_time)) as recent_end_dt,
            MAX(DATE(release_time)) as release_dt,
            MAX(cur_dt) as cur_dt 
        FROM
            tb_user_video_log
            JOIN tb_video_info 
            on tb_user_video_log.video_id = tb_video_info.video_id
            LEFT JOIN (
                SELECT
                    MAX(DATE(end_time)) as cur_dt
                FROM
                    tb_user_video_log
            ) as tb_max_dt ON 1 = 1
        GROUP BY
            video_id
        HAVING
            TIMESTAMPDIFF(DAY, release_dt, cur_dt) <= 29
    ) as t_video_info
ORDER BY
    hot_index DESC
LIMIT
    3;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互联网大厂SQL真题(三) 的相关文章

随机推荐

  • vnc view远程登录Linux

    转自http blog sina com cn s blog 49c306b201011had html 尽管我们可以使用 SSH连接远程通过字符界面来操作Linux xff0c 但是对于更多熟悉图形人来说是很不方便的 xff0c 因此开启
  • 【Python基础】之装饰器

    这是我初次接触装饰器 xff0c 先从初学者的角度介绍装饰器 xff0c 关于装饰器的应用场景举例 xff0c 后面再补充 1 装饰器的作用 装饰器可以让一个函数在不做任何变动的情况下新增额外的功能 如下代码 xff0c func name
  • Sonic simple服务中设备图片、测试用例运行异常图片、失败录像路径映射配置

    使用docker ps查看容器信息 使用docker exec it a2d69c075875 sh进入容器 xff0c 并查看容器文件 相关文件夹说明 xff1a imageFiles xff1a 测试用例运行截图信息 keepFiles
  • ubuntu vmware 虚拟网络编辑 ping 外网不通问题

    内网环境在192 168 1 1 网段 虚拟机想要ssh 接入 xff0c 并且可以上网 使用桥接方式和NAT方式都可以 互ping xff0c 但是上网遇到了问题 NAT解决方法如下 xff0c 桥接方式随后再研究 NAT 模式下子网IP
  • 深入解读相机矩阵

    在这片文章里 xff0c 你将了解到以下内容 xff1a 1 相机的针孔模型 2 相机矩阵的概念 3 相机内参的含义 4 相机外参的含义 1 相机针孔模型 针孔模型是相机成像的基础模型 xff0c 是理解后续相机矩阵内容的基础 下图描述了基
  • python 循环输入,用户输入回车结束

    输入的回车会被视为空字符 xff0c 可以用a 61 61 39 39 来作为结束循环的标志 n 61 while 1 a 61 input if a 61 61 39 39 break else n append a print n
  • OpenvSwitch 子项目 OVN 功能介绍(一)

    众所周知 xff0c OpenvSwitch 以其丰富的功能和不错的性能 xff0c 已经成为 Openstack 部署中最受欢迎的虚拟交换机 由于 Openstack Neutron 的架构引入了一些性能问题 xff0c 比如 neutr
  • SDN网络中的转发数据和数据传输

    数据驱动的网络 从数据驱动的角度来看网络 xff0c 会发现一张现实中的网络存在着各种数据 设计和管理一张网络 xff0c 主要是设计数据 xff0c 存储数据 xff0c 管理数据和分析数据 网络数据的规模 复杂度和变化速度 xff0c
  • [云计算]OpenStack - Neutron

    Neutron在OpenStack中的位置 可以为虚拟机或者 OpenStack 组件提供网络服务 xff0c xff08 由 Nova network 独立出来的 xff09 随着需承载业务的能力的增长作为 Nova 子组件无法满足 过程
  • 后台架构师除了技术,还有97件事,你知道吗?

    对于架构师 xff0c 很多人可能觉得很笼统 架构师到底需要学习什么 xff1f 学习完哪些技术就可以到架构师的水准 在行业内的话其实并没有一个非常明确的标准 技术是一方面 xff0c 但是如果仅仅只是技术的话 xff0c 具体一名合格的架
  • Failed to read artifact descriptor for xxx.jar

    mavne 项目 pom xml 文件标红 错误如下 xff1a Failed to read artifact descriptor for xxx jar Failed to read artifact descriptor for x
  • imx6q平台上移植mt7601

    本文描述如何将MT7601 WiFi模块移植到IMX6Q开发板上 xff0c 分析移植过程中碰到的问题 xff0c 分析错误原因 xff0c 提供解决办法 一 MT7601实物图 二 验证开发板和USB MT7601硬件是否正常 步骤1 x
  • 在图片上画出标注目标框和类别python程序

    在图片上画出标注目标框和类别python程序 xff0c 还是比较简单的 xff0c 直接上一份代码 xff1a usr bin python coding UTF 8 2018 07 11 by DQ import cv2 import
  • iOS性能监控及自动化测试辅助工具对比-tidevice、py-ios-device(pyidevice)、sonic-ios-bridge(sib)

    对比项 tidevice py ios device xff08 pyidevice xff09 sonic ios bridge xff08 sib xff09 是否开源 github地址 https github com alibaba
  • git中tag与release的创建以及两者的区别

    简介 本文辨析在参与开源项目时会遇到的tag与release的概念区别与联系 xff0c 并比较两者的创建方法 定义 标签 xff08 tag xff09 是特定提交 xff08 commit 一个指针 xff0c 也就是每个tag对应一个
  • 如何评价数仓好坏

    评价一个数仓的好坏可以涉及相当多的维度 xff0c 这里简单分享一些在实习时了解到的比较看重的方面 模型合理性 一个数仓模型的诞生往往是为了满足产品提出来的业务需求 xff0c 但是如果一个模型仅仅只能做到完全为这一次需求而服务的话 xff
  • 数据倾斜的判断方法和解决方案

    数据倾斜的判断方法 首先点开任务的sparkUI界面中的Stages xff0c 对Duration一列进行排序 xff0c 观察看有没有某个stage出现运行时间远大于其它stage的情况出现 xff0c 假设有的话 xff0c 就点开D
  • 数据开发中的资源管理优化(spark运行)

    在数据开发中 xff0c 资源管理主要看关注于队列整体的CPU使用率 xff0c 内存使用率或者单个任务的CPU使用率 xff0c 内存使用率 CPU使用率 默认情况下是一个core执行一个task 如果此时CPU利用率过低 xff0c 那
  • 互联网大厂SQL真题(二)

    题目 xff1a 每天的日活数及新用户占比 新用户占比 61 当天的新用户数 当天活跃用户数 xff08 日活数 xff09 如果in time 进入时间和out time 离开时间跨天了 xff0c 在两天里都记为该用户活跃过 新用户占比
  • 互联网大厂SQL真题(三)

    题目 xff1a 近一个月发布的视频中热度最高的top3视频 问题 xff1a 找出近一个月发布的视频中热度最高的top3视频 注 xff1a 热度 61 a 视频完播率 43 b 点赞数 43 c 评论数 43 d 转发数 新鲜度 xff