如何在Redshift中使用window functions仅聚合连续特定值的行?
解决方案:SQL实现连续B=1行的聚合需求
源表数据
| A | B | C |
|---|---|---|
| 1 | 0 | 12 |
| 2 | 0 | 13 |
| 3 | 1 | 5 |
| 4 | 1 | 1 |
| 5 | 1 | 2 |
| 6 | 0 | 22 |
| 7 | 0 | 20 |
| 8 | 1 | 1 |
| 9 | 1 | 10 |
| 10 | 0 | 11 |
| 11 | 0 | 12 |
预期结果
| new_A | new_C |
|---|---|
| 1 | 12 |
| 2 | 13 |
| 5 | 8 |
| 6 | 22 |
| 7 | 20 |
| 9 | 11 |
| 10 | 11 |
| 11 | 12 |
实现思路
核心是识别连续的B=1行组:通过累计计数生成分组ID,每次遇到B=0的行就累加计数,这样连续的B=1行会被归为同一个分组。之后对不同分组分别处理:
- B=0的行直接保留原A、C值
- B=1的分组聚合计算MAX(A)和SUM(C)
SQL代码
WITH grouped_data AS ( SELECT A, B, C, -- 生成分组ID:遇到B=0时累加,连续B=1行共享同一ID SUM(CASE WHEN B = 0 THEN 1 ELSE 0 END) OVER (ORDER BY A) AS group_id FROM your_table_name ) SELECT CASE WHEN B = 0 THEN A ELSE MAX(A) END AS new_A, CASE WHEN B = 0 THEN C ELSE SUM(C) END AS new_C FROM grouped_data GROUP BY group_id, B, CASE WHEN B = 0 THEN A ELSE NULL END, CASE WHEN B = 0 THEN C ELSE NULL END ORDER BY new_A;
代码说明
- CTE
grouped_data:通过窗口函数SUM() OVER (ORDER BY A)生成分组ID,确保连续的B=1行属于同一分组。 - 分组聚合:
- 对B=0的行,按
group_id+A+C分组,直接保留原数据 - 对B=1的分组,按
group_id+B分组,计算聚合值
- 对B=0的行,按
- 排序:最终按
new_A升序排列,匹配预期结果顺序
内容的提问来源于stack exchange,提问作者vellamatic
相关产品推荐
相关产品推荐

