【SQL 07 国庆期间每类视频点赞量和转发量】

题目描述

问题:
统计2021年国庆头3天每类视频每天的近一周总点赞量和一周内最大单天转发量,结果按视频类别降序、日期升序排序。假设数据库中数据足够多,至少每个类别下国庆头3天及之前一周的每天都有播放记录。
国庆头3天(10.01 ~ 10.03)里10.01的近7天(9.25 ~ 10.01)总点赞量为5次,单天最大转发量为2次(9月25那天最大);同理可得10.02和10.03的两个指标。

用户-视频互动表tb_user_video_log:
iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-10-01 10:00:002021-10-01 10:00:20011NULL
210220012021-10-01 10:00:002021-10-01 10:00:15001NULL
310320012021-10-01 11:00:502021-10-01 11:01:150101732526
410220022021-09-10 11:00:002021-09-10 11:00:30101NULL
510320022021-10-01 10:59:052021-10-01 11:00:05100NULL
610220022021-09-28 11:00:002021-09-28 11:00:30101NULL
710320022021-09-29 11:00:002021-10-02 11:00:30101NULL
810220022021-09-30 11:00:002021-09-30 11:00:30111NULL
910120012021-10-01 10:00:002021-10-01 10:00:20110NULL
1010220012021-10-01 10:00:002021-10-01 10:00:15001NULL
1110320012021-10-01 11:00:502021-10-01 11:01:151101732526
1210620022021-10-02 10:59:052021-10-02 11:00:05201NULL
1310720022021-10-02 10:59:052021-10-02 11:00:05101NULL
1410820022021-10-02 10:59:052021-10-02 11:00:05111NULL
1510920022021-10-03 10:59:052021-10-03 11:00:05010NULL
  • uid:用户ID
  • video_id:视频ID
  • start_time:开始观看时间
  • end_time:结束观看时间
  • if_follow:是否关注
  • if_like:是否点赞
  • if_retweet:是否转发
  • comment_id:评论ID
短视频信息表tb_video_info:
idvideo_idauthortagdurationrelease_time
12001901影视302021-01-01 07:00:00
22002901美食602021-01-01 07:00:00
32003902旅游902020-01-01 07:00:00
  • video_id:视频ID
  • author:创作者ID
  • tag:类别标签
  • duration:视频时长
  • release_time:发布时间
最终输出样式:
tagdtsum_like_cnt_7dmax_retweet_cnt_7d
旅游2021-10-0152
旅游2021-10-0253
旅游2021-10-0363

题目分析

题目理解:

  • 统计纬度:2021年国庆头3天每类视频每天的数据
    - 2021年内:筛选start_time 在2021年内;
    - 国庆头3天:筛选start_time 在 [ 2021-10-01,2021-10-03];
    - 每类视频每天:按视频类别和日期分组;
  • 统计指标:近一周总点赞量和一周内最大单天转发量
    - 近一周总点赞量:统计日+前6天的点赞量
    - 一周内最大单天转发量:统计日+前6天的最大转发量
  • 排序格式:
    - 按视频类别降序、日期升序排序

实现方式:

  • 统计纬度:
    - 用YEAR()函数获取日期中年份作为筛选条件:WHERE YEAR(start_time) = 2021
    - 用BETWEEN…AND…筛选国庆头3天的数据:BETWEEN 2021-10-01 AND 2021-10-03
    - 用GROUP BY 分组视频类别和日期:GROUP BY tap,start_time
  • 统计指标:
    - 近一周总点赞量:滑动窗口函数,按视频类别分类,日期排序滑动统计前6天+统计日的点赞量求和:SUM (like_cnt ) OVER ( PARTITION BY tag ORDER BY date1 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW )
    - 一周内最大单天转发量:滑动窗口函数,按视频类别分类,日期排序滑动统计前6天+统计日的最大转发量:MAX (retweet_cnt ) OVER ( PARTITION BY tag ORDER BY date1 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW )
  • 排序格式:
    - ORDER BY tag DESC, dt ASC

SQL实现

SELECT tag,dt,sum_like_cnt_7d,max_retweet_cnt_7d
FROM
(SELECT tag,date_start AS dt,
    SUM(like_cnt) OVER(PARTITION BY tag ORDER BY date_start ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) sum_like_cnt_7d,
    MAX(retweet1) OVER(PARTITION BY tag ORDER BY date_start ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) max_retweet_cnt_7d
FROM(
    SELECT t2.tag,
        DATE_FORMAT(t1.start_time,'%Y-%m-%d') AS date_start,
        SUM(if_like) AS like_cnt,
        SUM(a.if_retweet) AS retweet_cnt
    FROM tb_user_video_log t1
        LEFT JOIN tb_video_info t2
        USING(video_id)
    WHERE YEAR(t1.start_time)=2021
    GROUP BY t2.tag,date_start) table1
GROUP BY tag,date1) table2
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
GROUP BY tag,dt
ORDER BY tag DESC,dt ASC
Reference

牛客网练习
CSDN MySQL date_format()函数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eason DayDayUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值