SQL查询问题排查与修正:音乐流媒体数据多指标统计需求
原代码存在的问题
- 语法错误:年初累计播放量的窗口函数和排名窗口函数之间缺少逗号分隔,
RANK()函数末尾多了多余逗号,会直接触发语法报错;表别名大小写混用,部分对标识符大小写敏感的数据库会出现字段找不到的报错。 - 逻辑漏洞:专辑月度排名的窗口函数分区仅设置了album和month,未加入年份,会导致不同年份的同月份歌曲混合排名,不符合按月度排名的需求。
- 指标无别名:三个计算指标都未定义别名,返回结果无法直接对应需求的三项指标。
- 连接写法不规范:使用隐式逗号连接,可读性差,不符合现代SQL编写规范,容易误写产生笛卡尔集。
- 潜在排序风险:若
Time表的month字段为字符串类型(如'1月'、'2月'),窗口函数排序会出现乱序,导致累计值计算错误。
修正后的SQL代码
SELECT t.year, t.month, s.song, s.album, -- 月度总播放量 SUM(ms.Numberofstreamings) AS monthly_total_stream, -- 当年年初至今累计播放量 SUM(SUM(ms.Numberofstreamings)) OVER ( PARTITION BY s.songId, t.year ORDER BY t.month ASC ROWS UNBOUNDED PRECEDING ) AS year_to_date_stream, -- 专辑内月度播放量排名 RANK() OVER ( PARTITION BY s.album, t.year, t.month ORDER BY SUM(ms.Numberofstreamings) DESC ) AS album_monthly_rank FROM Song s INNER JOIN MusicStreaming ms ON s.SongId = ms.SongId INNER JOIN Time t ON ms.TimeId = t.TimeId GROUP BY s.songId, s.song, s.album, t.year, t.month;
补充说明
- 排名逻辑如果需要同播放量不跳号,可以把
RANK()替换为DENSE_RANK()使用。 - 如果
month字段是字符串格式,排序时可以替换为t.date或者月份对应的数字字段,保证累计顺序正确。 - 新增了年份、专辑字段返回,方便结果校验和使用,不需要可以从SELECT中直接删除。
内容的提问来源于stack exchange,提问作者user15070780
相关产品推荐
相关产品推荐

