SQL Server 2022中跨年度InterimData累计差值计算求助
解决方案(SQL Server 2022)
步骤分解
- 第一步:聚合提取每年的唯一
InterimData值,同一年份内所有记录的该值一致,用GROUP BY即可实现。 - 第二步:使用
LAG()窗口函数获取上一年的计算结果,结合常量12800推导当年的最终值。 - 第三步:动态拼接计算逻辑的文本说明,匹配预期输出格式。
完整SQL代码
WITH YearlyData AS ( -- 提取每年唯一的InterimData值 SELECT 年份, MAX(临时数据(InterimData)) AS YearlyInterimData -- 同一年所有值相同,MAX/MIN/AVG均可 FROM YourTableName -- 替换为你的实际表名 GROUP BY 年份 ), FinalCalculations AS ( -- 计算每年的FinalValue和逻辑说明 SELECT 年份, -- 第一年用常量减去当年值,后续年份用上一年结果减当年值 CASE WHEN LAG(YearlyInterimData) OVER (ORDER BY 年份) IS NULL THEN 12800 - YearlyInterimData ELSE LAG(12800 - YearlyInterimData) OVER (ORDER BY 年份) - YearlyInterimData END AS 最终值(FinalValue), -- 拼接逻辑文本 CASE WHEN LAG(YearlyInterimData) OVER (ORDER BY 年份) IS NULL THEN '(Constant - ' + CAST(年份 AS VARCHAR) + '年唯一InterimData值)' ELSE '(' + CAST(LAG(年份) OVER (ORDER BY 年份) AS VARCHAR) + '年FinalValue - ' + CAST(年份 AS VARCHAR) + '年唯一InterimData值)' END AS 计算逻辑(Logic) FROM YearlyData ) SELECT * FROM FinalCalculations ORDER BY 年份;
代码说明
- YearlyData CTE:通过
GROUP BY 年份聚合,确保每个年份仅保留一个InterimData值,用MAX()可避免NULL值干扰。 - FinalCalculations CTE:
- 利用
LAG()函数判断是否为第一年(无前置记录),分别执行对应计算逻辑。 - 动态拼接逻辑说明文本,完全匹配预期输出的描述格式。
- 利用
- 最后按年份排序输出,保证结果顺序正确。
执行结果
运行代码后将得到与预期一致的输出:
| 年份 | 最终值(FinalValue) | 计算逻辑(Logic) |
|---|---|---|
| 2022 | 8933.333333 | (Constant - 2022年唯一InterimData值) |
| 2023 | 1516.666666 | (2022年FinalValue - 2023年唯一InterimData值) |
内容的提问来源于stack exchange,提问作者user2545157
相关产品推荐
相关产品推荐

