如何用Snowflake SQL的RANK() OVER()窗口函数实现指定分组求和需求
解决方案
原代码存在以下几个问题:
- 子查询中
AMT2与RANK()之间缺少逗号,触发语法错误 - 排序字段使用了
LAST_MODIFIED_DATE,但需求里的日期字段是MOD_DATE,字段名不匹配 - 未实现
AMT2的求和操作,也未按A、B、C、AMT1完成分组
根据你的需求,提供两种可行写法:
方法一:直接过滤指定最新日期后分组求和
若明确最新日期为20221104,可直接过滤该日期的数据,再按要求分组求和:
SELECT A, B, C, AMT1, SUM(AMT2) AS SUM_AMT2 FROM INPUT_TABLE WHERE MOD_DATE = 20221104 GROUP BY A, B, C, AMT1;
方法二:动态获取每个分组的最新日期(若日期非固定值)
若需求是每个A、B、C分组的最新MOD_DATE数据,再按A、B、C、AMT1分组求和,可修正窗口函数写法:
SELECT A, B, C, AMT1, SUM(AMT2) AS SUM_AMT2 FROM ( SELECT A, B, C, AMT1, AMT2, RANK() OVER (PARTITION BY A, B, C ORDER BY MOD_DATE DESC) AS rk FROM INPUT_TABLE ) t WHERE rk = 1 GROUP BY A, B, C, AMT1;
说明
- 方法一适用于已知固定最新日期的场景,性能更优
- 方法二适用于每个分组最新日期不同的场景,通过窗口函数筛选出每组最新数据后再求和
内容的提问来源于stack exchange,提问作者punsoca
相关产品推荐
相关产品推荐

