Snowflake SQL实现分组总和减去逐月累计金额的需求求助
Snowflake SQL 实现目标列计算
问题分析
你要生成的目标列逻辑是:按Region(区域)和Type(类型)分组的总金额,减去截至当前月份的累计金额(含当月)。现有代码的问题在于:
lag(amount)只能取上一行的单月金额,无法计算累计值;- 窗口函数的
partition by错误包含了month,导致分组逻辑失效; sum - amt仅用总金额减去当月金额,没有累计的逻辑。
正确SQL实现
SELECT region, type, month, amount, -- 分组总金额减去截至当前月的累计金额,得到目标列 SUM(amount) OVER (PARTITION BY region, type) - SUM(amount) OVER (PARTITION BY region, type ORDER BY month) AS target_amount FROM your_table_name;
代码说明
- 分组总金额:
SUM(amount) OVER (PARTITION BY region, type)计算每个Region+Type组合的所有月份金额总和; - 累计金额:
SUM(amount) OVER (PARTITION BY region, type ORDER BY month)按月份排序,默认计算从第一个月到当前月的累计金额(等价于ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); - 目标列:用分组总金额减去累计金额,得到符合需求的结果。
对应你举的示例:
- USA+Apple总金额170,第一行累计10,170-10=160;第二行累计10+20=30,170-30=140,完全匹配预期;
- Europe+Orange总金额135,第13行累计10,135-10=125;第14行累计10+5=15,135-15=120,也符合要求。
内容的提问来源于stack exchange,提问作者StackOne
相关产品推荐
相关产品推荐

