题解 | 国庆期间每类视频点赞量和转发量 —— W1uSeven7 -- NO.02

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

https://www.nowcoder.com/practice/f90ce4ee521f400db741486209914a11

写一下题解,顺便复盘这道题的思路:

看到题干对于输出示例的解释,很自然想到这题至少要用一层子查询(因为要用窗口函数进行跨组累加,做的过程中发现要两层):

  1. 先写第一层子查询 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;

总结下来,这道题思路不复杂,主要是涉及两个知识点的查漏补缺:

  1. 如何改变窗口函数的计算范围(我附了一张表在下面)
  2. 如何跨组累加(使用子查询)

记录一下第二篇题解(*^▽^*)

金枪在握无敌手,黄龙待缚,问长缨何在

SELECT FROM SP ZHAO YUN

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务