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

with CTE 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
    and u.age between 18 and 25
    and s.singer_name='周杰伦'
    group by month(p.fdate),s.song_name,p.song_id
) 
select * from CTE where ranking <= 3 

/*
参考其他uu的思路写出了这道题目答案,
一共三张表(流水表play_log、歌曲表song_info、用户表user_info)
需要输出month、ranking、song_name、play_pv
month可以通过流水表中的fdate获取 month(fdate) as 'month'
song_name可以通过歌曲表中同名列song_name获取
ranking需要使用窗口函数row_number给出排序,这里ranking是根据每个月份分1、2、3的,
因此通过partition by(fdate)将数据分为不同窗口,再根据song_name出现的次数统计降序排列,
并根据示例输出还需要将song_id按默认升序排列
通过where语句筛选年龄在18-25岁、年份为2022、歌手姓名为周杰伦的歌曲
由于使用了聚合函数SUM以及窗口函数row_number因此还需要对数据进行分组,因此使用group by子句
最后再根据ranking取出符合筛选条件的前三名的相关数据
*/










全部评论

相关推荐

Yki_:以下条件优先录用: 喜欢去缅北当猪仔的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务