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

基于最新日期按人员分组的年度累计求和SQL语句修正求助

修正累计求和(Running Total)SQL语句的方案

看起来你是想基于每个人员的最新下载日期数据,计算他们2018年度的累计金额。你的原语句存在语法和逻辑上的问题,我来帮你一步步修正:

原语句的问题分析

  1. 语法错误:over(partition by [Year],[Person] order by [Enddate) 这里缺少了闭合的括号,正确的写法应该是over(partition by [Year],[Person] order by [Enddate])。
  2. 逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:19:15