MySQL 国庆期间每类视频点赞量和转发量

用户-视频互动表tb_user_video_log

iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-09-24 10:00:002021-09-24 10:00:20110NULL
210520022021-09-25 11:00:002021-09-25 11:00:30001NULL
310220022021-09-25 11:00:002021-09-25 11:00:30111NULL
410120022021-09-26 11:00:002021-09-26 11:00:30101NULL
510120022021-09-27 11:00:002021-09-27 11:00:30110NULL
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旅游302020-01-01 07:00:00
22002901旅游602021-01-01 07:00:00
32003902影视902020-01-01 07:00:00
42004902美女902020-01-01 08:00:00

(ideo_id-视频ID, author-创作者ID, tag-类别标签, duration-视频时长, release_time-发布时间)

问题:统计2021年国庆头3天每类视频每天的近一周总点赞量和一周内最大单天转发量,结果按视频类别降序、日期升序排序。假设数据库中数据足够多,至少每个类别下国庆头3天及之前一周的每天都有播放记录。

重点:

  1. 2021年国庆头三天
  2. 每类视频每天的近一周总点赞量、一周内最大单天转发量
  3. 排序

思路:

如何求每类视频每天的近一周总点赞量和一周内最大单天转发量?

先求出每类视频每天的点赞总量和转发量,再求一周的。

--每类视频每天的总点赞量和总转发量
select tag,date_format(start_time,'%Y-%m-%d') dt,
sum(if_like) sum_like,sum(if_retweet) sum_retweet
from
tb_user_video_log u left join
tb_video_info v on u.video_id = v.video_id
group by tag,dt

输出结果如下:

 

 

一周的数据该如何求?

可以借助窗口函数开窗求和,那一周如何表示?

bingo!滑动窗口求解。

sum(sum_like) over(partition by tag order by dt rows 6 preceding) 
sum_like_cnt_7d,
max(sum_retweet) over(partition by tag order by dt rows 6 preceding) 
max_retweet_cnt_7d

整理到一起:

-- 每天的近一周总点赞量、一周内最大单天转发量   滑动窗口函数
select tag,dt,
sum(sum_like) over(partition by tag order by dt rows 6 preceding) 
sum_like_cnt_7d,
max(sum_retweet) over(partition by tag order by dt rows 6 preceding) 
max_retweet_cnt_7d
from
-- 计算每类视频每天的总点赞量、总关注量  
(select tag,date_format(start_time,'%Y-%m-%d') dt,
sum(if_like) sum_like,sum(if_retweet) sum_retweet
from
tb_user_video_log u left join
tb_video_info v on u.video_id = v.video_id
group by tag,dt) t1

此时输出结果如下

 

下面是时间限制,国庆头三天,上面我们已经将日期表示改写,可直接输入,但不能直接在上述函数后添加,why?

窗口函数是在where子句后执行,若直接写where子句则窗口函数执行的时间范围不再是一周,所以可以再嵌套一个查询。

-- 每天的近一周总点赞量、一周内最大单天转发量   滑动窗口函数
select * from
(select tag,dt,
sum(sum_like) over(partition by tag order by dt rows 6 preceding) 
sum_like_cnt_7d,
max(sum_retweet) over(partition by tag order by dt rows 6 preceding) 
max_retweet_cnt_7d
from
-- 计算每类视频每天的总点赞量、总关注量  
(select tag,date_format(start_time,'%Y-%m-%d') dt,
sum(if_like) sum_like,sum(if_retweet) sum_retweet
from
tb_user_video_log u left join
tb_video_info v on u.video_id = v.video_id
group by tag,dt) t1)t2
where dt between '2021-10-01' and '2021-10-03'
order by tag desc,dt 

最终结果:

 

关于窗口函数:

<窗口函数> over (partition by <字段名> order by <字段名> [滑动窗口] )

滑动窗口部分可以是:

rows:选择数据前后几行

range:选择数据范围

rows n preceding  --表示前n行到当前行,共n+1行
rows between current row and n following  -- 表示当前行到往后n行
rows between m preceding and n following  -- 表示往前m到往后n行,共m+n+1行

range between m preceding and n following --表示所有值在[c−m,c+n]范围内的行,c为当前行的值
-- 表示日期范围时,必须使用Interval
range interval 7 day 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值