You need to enable JavaScript to run this app. SQL查询问题排查与修正:音乐流媒体数据多指标统计需求
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 01:27:04