题解 | #每类视频近一个月的转发量/率#
每类视频近一个月的转发量/率
https://www.nowcoder.com/practice/a78cf92c11e0421abf93762d25c3bfad
前置函数
SQL 提供了 DATE_SUB() 和 DATE_ADD() 两个函数,分别用于从日期或时间戳中减去和加上时间间隔。
- DATE_SUB():用于从日期或时间戳中减去时间间隔。
- DATE_ADD():用于向日期或时间戳中加上时间间隔。
DATE_SUB()用法DATE_SUB(date, INTERVAL expr unit):此函数从 date 参数中减去一个由 expr 和 unit 定义的时间间隔。date:这是要从中减去时间间隔的日期或时间戳。INTERVAL expr unit:定义要减去的时间间隔。expr 是一个整数表达式,代表时间间隔的数量;unit 是时间单位,可以是 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 等。
问题分解
- 关联两表tb_user_video_log uv join tb_video_id vi using (video_id)
- 转发量sum(uv.if_retweet)
- 转发率保留三位小数round(sum(uv.if_retweet)/count(1), 3)
- 筛选最近30天的记录:找到今天的日期即范围终点:Max(DATE(start_time))往过去推移30天即范围起始点: date_sub(Max(DATE(start_time)),Interval 30 Day)筛选最近30天的记录:where date(start_time)>(select date_sub(Max(DATE(start_time)),Interval 30 Day) from tb_uservideo_log) //以今天为截至,往前30天的范围都选出来
- 按视频类别分 group by tag
- 按转发倒序排序 order by retweet_rate desc
select tag, sum(uv.if_retweet) as retweet_cut, round(sum(uv.if_retweet)/count(1), 3) as retweet_rate from tb_user_video_log uv join tb_video_info USING (video_id) where date(start_time) > (select date_sub(max(start_time), interval 30 day) from tb_user_video_log) group by tag order by retweet_rate desc;