题解 | 每个月Top3的周杰伦歌曲

每个月Top3的周杰伦歌曲

https://www.nowcoder.com/practice/4ab6d198ea8447fe9b6a1cad1f671503


-- 问题提炼:18-25岁用户   在2022年   周杰伦的歌曲  每个月播放次数top 3

-- ORDER BY COUNT(s.song_name) DESC:
--  对当前分区(即当前月份)内的每首歌曲的播放记录数量进行统计,播放次数多的歌曲会排在前面

WITH t AS (
	SELECT
		MONTH(p.fdate) AS `month`
		,ROW_NUMBER() OVER(PARTITION BY MONTH(p.fdate) ORDER BY COUNT(s.song_name) DESC, p.song_id ASC) AS ranking
		,s.song_name 
		,COUNT(s.song_name) AS play_pv
	FROM 
        play_log p 
        LEFT JOIN song_info s ON p.song_id = s.song_id
        LEFT JOIN user_info u ON p.user_id = u.user_id
	WHERE 
        YEAR(p.fdate) = 2022         -- 在2022年
		AND u.age BETWEEN 18 AND 25  -- 18-25岁用户
		AND s.singer_name = '周杰伦'  -- 周杰伦的歌曲
	GROUP BY MONTH(p.fdate), s.song_name, p.song_id  -- 窗口函数中用到song_id,所以分组时要加上
)
SELECT * FROM t WHERE ranking <= 3  -- 每个月播放次数top 3
;

题目要求:

关联3张表:

根据 题目要求 和 关联3张表的结果,差ranking和play_pv字段,分组,开窗,然后统计即可。

END

全部评论
为什么一定要窗口函数里加song_id不加就会有两行不一样,在本地也看不出来,求解
2 回复 分享
发布于 2024-12-25 10:20 辽宁
请问:为什么GROUP BY MONTH(p.fdate), s.song_name, p.song_id中,一定要把song_name, song_id都写出来,只写一个不行吗?在song_info表中song_name, song_id也是一一对应的呀
点赞 回复 分享
发布于 06-20 12:55 辽宁
order by 中 COUNT(s.song_name) DESC 按歌曲的播放次数降序排序。播放次数高的歌曲排名靠前。 p.song_id ASC 当播放次数相同时,按歌曲 ID 升序排序。确保在播放次数相同的情况下,排名是唯一且确定的。
点赞 回复 分享
发布于 05-24 18:50 广东
为什么要用left join呢?直接join不也可以满足需求吗?
点赞 回复 分享
发布于 04-18 18:16 广东
请问,为什么group by那一行之后直接加having ranking <= 3不行呢?
点赞 回复 分享
发布于 02-15 16:48 北京
为什么要用到group by呢不理解
点赞 回复 分享
发布于 2024-09-03 11:31 上海
这是我认为写的最清楚,思路最易懂的了,赞了
点赞 回复 分享
发布于 2024-08-24 20:06 福建

相关推荐

不愿透露姓名的神秘牛友
昨天 13:47
点赞 评论 收藏
分享
07-03 16:02
门头沟学院 Java
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
评论
62
5
分享

创作者周榜

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