SQL Server查询1977-2020年年度最高销量Top游戏问题求助
解决SQL Server查询每年销量最高游戏的问题
问题背景
操作1977-2020年的电子游戏销量数据表,需要查询每年销量最高的Top1游戏。当前使用的查询语句存在两个问题:
- 返回结果有重复年份
- 游戏对应的年份偏差10年
期望得到1977-2020年每年仅一条最高销量游戏的结果。
当前查询语句
SELECT VG1.Name, VG4.Release_Date, ROUND(SUM(VG3.Global_sales),2) AS Total_Sales FROM Video_Game_Sales VG1 INNER JOIN Video_Game_Sales VG2 ON VG1.Name = VG2.Name INNER JOIN Video_Game_Sales VG3 ON VG2.Global_sales = VG3.Global_sales INNER JOIN Video_Game_Sales VG4 ON VG3.Release_Date = VG4.Release_Date GROUP BY VG4.Release_Date, VG1.Name ORDER BY VG4.Release_Date, ROUND(SUM(VG3.Global_sales),2) DESC;
问题分析
原语句的核心问题:
- 无意义的多次自连接:把同名称、同销量、同发布日期的记录强行关联,导致数据重复计算,逻辑完全冗余
- 未按年份聚合:直接用
Release_Date(完整日期)分组,若同一年有多个发布日期的同游戏,会拆分成多条记录,出现重复年份 - 缺少排名筛选逻辑:仅做了排序,但没提取每个年份的第一条记录,无法保证每年只返回一个结果
- 年份处理缺失:没有从
Release_Date中提取年份,可能导致日期解析错误(比如把日期格式识别错,出现年份偏差10年的情况)
正确解决方案
使用SQL Server的窗口函数ROW_NUMBER()来实现按年份排名,同时先按年份聚合销量:
-- 第一步:按年份和游戏名称计算总销量 WITH GameYearSales AS ( SELECT YEAR(Release_Date) AS Release_year, Name AS Title, ROUND(SUM(Global_sales), 2) AS Total_Sales FROM Video_Game_Sales -- 限定年份范围 WHERE YEAR(Release_Date) BETWEEN 1977 AND 2020 GROUP BY YEAR(Release_Date), Name ), -- 第二步:按年份对游戏销量降序排名 RankedGames AS ( SELECT Release_year, Title, Total_Sales, ROW_NUMBER() OVER (PARTITION BY Release_year ORDER BY Total_Sales DESC) AS SalesRank FROM GameYearSales ) -- 第三步:筛选每个年份排名第一的游戏 SELECT Release_year, Title, Total_Sales FROM RankedGames WHERE SalesRank = 1 ORDER BY Release_year;
期望结果示例
| Release_year | Title | Total_Sales |
|---|---|---|
| 1977 | Combat | 1.25 |
| 1978 | Space Invaders | 2.53 |
| 1980 | Asteroids | 4.31 |
内容的提问来源于stack exchange,提问作者Nickolas Jaramillo
相关产品推荐
相关产品推荐

