MySQL经典题目—从听歌流水中找到18-25岁用户在2022年每个月播放次数top 3的周杰伦的歌曲

题目:每个月Top3的周杰伦歌曲

从听歌流水中找到18-25岁用户在2022年每个月播放次数top 3的周杰伦的歌曲

①建表添加数据

USE test2;
DROP TABLE IF EXISTS play_log;
CREATE TABLE `play_log` (
    `fdate` DATE,
    `user_id` INT,
    `song_id` INT
);
INSERT INTO play_log(fdate, user_id, song_id) VALUES 
('2022-01-08', 10000, 0),
('2022-01-16', 10000, 0),
('2022-01-20', 10000, 0),
('2022-01-25', 10000, 0),
('2022-01-02', 10000, 1),
('2022-01-12', 10000, 1),
('2022-01-13', 10000, 1),
('2022-01-14', 10000, 1),
('2022-01-10', 10000, 2),
('2022-01-11', 10000, 3),
('2022-01-16', 10000, 3),
('2022-01-11', 10000, 4),
('2022-01-27', 10000, 4),
('2022-02-05', 10000, 0),
('2022-02-19', 10000, 0),
('2022-02-07', 10000, 1),
('2022-02-27', 10000, 2),
('2022-02-25', 10000, 3),
('2022-02-03', 10000, 4),
('2022-02-16', 10000, 4);

DROP TABLE IF EXISTS song_info;
CREATE TABLE `song_info` (
    `song_id` INT,
    `song_name` VARCHAR(255),
    `singer_name` VARCHAR(255)
);

INSERT INTO song_info(song_id, song_name, singer_name) VALUES
(0, '明明就', '周杰伦'),
(1, '说好的幸福呢', '周杰伦'),
(2, '江南', '林俊杰'),
(3, '大笨钟', '周杰伦'),
(4, '黑键', '林俊杰');

DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
    `user_id`   INT,
    `age`       INT
);
INSERT INTO user_info(user_id, age) VALUES
(10000, 18)

 表play_log:

  表song_info:

  表user_info:

②逐步分析:

-- 1.多表关联:找出每个月周杰伦每一首歌的的播放量

-- 1.多表关联:找出每个月周杰伦每一首歌的的播放量
SELECT MONTH(fdate) `month`,s.song_name,COUNT(*) play_pv
FROM play_log p JOIN user_info u
ON p.user_id=u.user_id 
JOIN (SELECT song_id,song_name FROM song_info WHERE singer_name="周杰伦") s
ON p.song_id = s.song_id
GROUP BY `month`,s.song_name

-- 2.生成排名:根据每一首歌的播放量生成每个月中的播放量排名,

使用的是窗口函数:ROW_NUMBER() 和 over()

-- 2.生成排名:根据每一首歌的播放量生成每个月中的播放量排名,
-- 使用的是窗口函数:ROW_NUMBER() 和 over()
SELECT `month`,
ROW_NUMBER() over(PARTITION BY MONTH ORDER BY play_pv DESC) ranking,
song_name,
play_pv
FROM (
	SELECT MONTH(fdate) `month`,s.song_name,COUNT(*) play_pv
	FROM play_log p JOIN user_info u
	ON p.user_id=u.user_id 
	JOIN (SELECT song_id,song_name FROM song_info WHERE singer_name="周杰伦") s
	ON p.song_id = s.song_id
	GROUP BY `month`,s.song_name
	) tmp
) tmp2

-- 3.返回排名前3的数据:使用where筛选条件

-- 3.返回排名前3的数据:使用where筛选条件
SELECT *  
FROM (
	SELECT `month`,
	ROW_NUMBER() over(PARTITION BY MONTH ORDER BY play_pv DESC) ranking,
	song_name,
	play_pv
	FROM (
		SELECT MONTH(fdate) `month`,s.song_name,COUNT(*) play_pv
		FROM play_log p JOIN user_info u
		ON p.user_id=u.user_id 
		JOIN (SELECT song_id,song_name FROM song_info WHERE singer_name="周杰伦") s
		ON p.song_id = s.song_id
		GROUP BY `month`,s.song_name
		) tmp
	) tmp2
WHERE ranking<4
ORDER BY `month`,ranking

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利威尔·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值