题解 | #每类视频近一个月的转发量/率#
每类视频近一个月的转发量/率
https://www.nowcoder.com/practice/a78cf92c11e0421abf93762d25c3bfad
select tag, sum(if_retweet), round(sum(if_retweet) / count(1),3) from tb_user_video_log log left join tb_video_info info on log.video_id = info.video_id where datediff( (select max(start_time) from tb_user_video_log), start_time ) <= 29 group by 1 order by 2 desc
- SELECT 子句 tag: 选择视频的标签。 sum(if_retweet): 计算每个标签的转发总次数 (if_retweet 的总和)。 round(sum(if_retweet) / count(1), 3): 计算转发占比,并四舍五入到小数点后三位。
- sum(if_retweet) / count(1) 的解释 sum(if_retweet): 计算每个标签下被转发的次数总和。假设 if_retweet 是一个二进制字段,1 表示该视频被转发,0 表示未转发。 count(1): 计算每个标签的总记录数,即这个标签下所有视频的总数。这里的 count(1) 等价于 count(*),表示计数当前分组中的所有行。 sum(if_retweet) / count(1): 表示每个标签下被转发的次数占该标签总视频数的比例。它计算了在该标签下的视频被转发的比率,或称为转发率。
- FROM tb_user_video_log log 从 tb_user_video_log 表中选择数据,这个表可能存储用户的视频观看记录。
- LEFT JOIN tb_video_info info ON log.video_id = info.video_id 对 tb_user_video_log 和 tb_video_info 表进行左连接,连接条件是 video_id 相同。tb_video_info 可能存储了视频的元数据,如标签信息等。
- WHERE 子句 datediff((select max(start_time) from tb_user_video_log), start_time) <= 29: datediff 函数计算两个日期之间的天数差。 这个条件筛选出最近一个月内的记录,具体来说是从 tb_user_video_log 表中找出距离最新记录的时间在 29 天内(不含第30天)的所有数据。
- GROUP BY 1 对查询结果按照第一个选择的字段(即 tag)进行分组,计算每个标签的转发总次数和转发率。
- ORDER BY 2 DESC 最后,对分组后的结果按第二列 (sum(if_retweet),即转发总次数) 进行降序排列,确保转发次数最多的标签排在最前面。 总结 这段 SQL 代码的作用是:在最近一个月内,根据视频标签计算转发次数的总和,以及每个标签的转发率,并按转发次数从高到低排序。sum(if_retweet) / count(1) 表示在每个标签下的视频中,被转发的比例,即转发率。