基于最新日期按人员分组的年度累计求和SQL语句修正求助
修正累计求和(Running Total)SQL语句的方案
看起来你是想基于每个人员的最新下载日期数据,计算他们2018年度的累计金额。你的原语句存在语法和逻辑上的问题,我来帮你一步步修正:
原语句的问题分析
- 语法错误:
over(partition by [Year],[Person] order by [Enddate)这里缺少了闭合的括号,正确的写法应该是over(partition by [Year],[Person] order by [Enddate])。 - 逻辑错误:
where max(Downloaded)这种写法不合法——聚合函数max()不能直接放在WHERE子句中,你需要先筛选出每个人员的最新下载记录,再计算累计求和。
修正后的完整SQL语句
假设你的表名为YourTable,包含字段Person、Year、Enddate、Amount、Downloaded,可以用CTE(公共表表达式)先筛选出每个人员的最新下载数据,再计算累计求和:
WITH LatestPersonRecords AS ( SELECT *, -- 给每个人员的记录按下载日期降序编号,最新的记录编号为1 ROW_NUMBER() OVER (PARTITION BY Person ORDER BY Downloaded DESC) AS RecordRank FROM YourTable WHERE Year = 2018 -- 限定仅处理2018年的数据 ) SELECT Person, Year, Enddate, Amount, -- 计算每个人员2018年度的累计金额,按Enddate排序 SUM(Amount) OVER ( PARTITION BY Person, Year ORDER BY Enddate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS AnnualRunningTotal FROM LatestPersonRecords WHERE RecordRank = 1 -- 仅保留每个人员的最新下载记录 ORDER BY Person, Enddate;
关键说明
- 筛选最新记录:用
ROW_NUMBER()窗口函数给每个人员的记录按Downloaded降序编号,取RecordRank = 1就能拿到每个人员的最新下载数据。 - 累计求和逻辑:
SUM(Amount) OVER (...)按Person和Year分区,确保每个人员每年单独计算累计;ORDER BY Enddate保证累计是按时间顺序进行的;ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW明确指定累计范围是从当前分区的第一条记录到当前记录(这也是窗口函数的默认行为,加上会更清晰)。
如果你的需求是“针对每个下载日期,计算所有人员的年度累计总和”(而非每个人员单独的累计),可以调整分区条件为PARTITION BY Year, Downloaded,你可以根据实际需求再调整!
内容的提问来源于stack exchange,提问作者miltenburger
相关产品推荐
相关产品推荐

