You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server查询1977-2020年年度最高销量Top游戏问题求助

解决SQL Server查询每年销量最高游戏的问题

问题背景

操作1977-2020年的电子游戏销量数据表,需要查询每年销量最高的Top1游戏。当前使用的查询语句存在两个问题:

  1. 返回结果有重复年份
  2. 游戏对应的年份偏差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_yearTitleTotal_Sales
1977Combat1.25
1978Space Invaders2.53
1980Asteroids4.31

内容的提问来源于stack exchange,提问作者Nickolas Jaramillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:51:36