题解 | 国庆期间每类视频点赞量和转发量 —— W1uSeven7 -- NO.02
国庆期间每类视频点赞量和转发量
https://www.nowcoder.com/practice/f90ce4ee521f400db741486209914a11
写一下题解,顺便复盘这道题的思路:
看到题干对于输出示例的解释,很自然想到这题至少要用一层子查询(因为要用窗口函数进行跨组累加,做的过程中发现要两层):
- 先写第一层子查询 t1:
- 子查询先过滤掉两表连接后非2021年以及非9.25~10.03的数据
- 再按标签和时间分组,使用SUM( )函数得到每个标签每天的点赞量和转发量,记作like_cnt和retweet_cnt
2. t1外层用窗口函数,按标签分组,按日期升序排列,计算范围划分为当前行及其前六行(共七行):
- 关键知识点:
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW表示当前行及其前六行(共七行) - 用SUM(like_cnt ) 和 MAX( retweet_cnt ) 对于每组(每个tag)的各行分别计算出近七天的总点赞量和单天最大转发量
3. 写到这发现这样得到的结果包括9.25~10.03的数据,而非题目要求的国庆前三天,也就是10.01~10.03
4. 意识到要过滤掉9.25~9.30这几天的数据,反应过来还要再套一层子查询t2:
- 就在外层多加一个
WHERE month(dt) = 10即可 - 最后再按标签降序排列,日期升序排列
SELECT tag,dt,sum_like_cnt_7d,max_retweet_cnt_7d
FROM(SELECT tag,dt,
SUM(like_cnt) OVER(
PARTITION BY tag
ORDER BY dt
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS sum_like_cnt_7d,
MAX(retweet_cnt) OVER(
PARTITION BY tag
ORDER BY dt
-- 表示包括当前行在内的前七行
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS max_retweet_cnt_7d
FROM
(SELECT tag,date(start_time) as dt,SUM(if_like) as like_cnt,SUM(if_retweet) as retweet_cnt
FROM
tb_user_video_log AS tvl
INNER JOIN
tb_video_info AS tvi
ON tvl.video_id = tvi.video_id
WHERE year(start_time) = 2021 AND date(start_time) BEW '2021-09-25' AND date(start_time) <= '2021-10-03'
GROUP BY tag,dt
)t1
)t2
WHERE month(dt) = 10
ORDER BY tag DESC,dt;
总结下来,这道题思路不复杂,主要是涉及两个知识点的查漏补缺:
- 如何改变窗口函数的计算范围(我附了一张表在下面)
- 如何跨组累加(使用子查询)
记录一下第二篇题解(*^▽^*)
金枪在握无敌手,黄龙待缚,问长缨何在
SELECT FROM SP ZHAO YUN
查看9道真题和解析