Redshift SQL:分组后合并特定前缀行并求和的实现方法
问题场景
执行以下分组查询:
SELECT ColumnA, SUM(ColumnB) FROM table GROUP BY ColumnA;
得到结果表:
| ColumnA | ColumnB |
|---|---|
| Car | 999 |
| Bike | 500 |
| Motorbike red | 1000 |
| Motorbike blue | 1500 |
需要合并所有以"Motorbike"开头的行,最终期望结果:
| ColumnA | ColumnB |
|---|---|
| Car | 999 |
| Bike | 500 |
| Motorbikes | 2500 |
解决方案
核心是通过CASE表达式统一分组标识,把以"Motorbike"开头的行归为同一组,推荐直接在原表上完成分组(效率更高):
SELECT CASE WHEN ColumnA LIKE 'Motorbike%' THEN 'Motorbikes' ELSE ColumnA END AS ColumnA, SUM(ColumnB) AS ColumnB FROM table GROUP BY CASE WHEN ColumnA LIKE 'Motorbike%' THEN 'Motorbikes' ELSE ColumnA END;
如果只能基于已分组后的结果表(假设表名为grouped_result)处理,可执行二次分组:
SELECT CASE WHEN ColumnA LIKE 'Motorbike%' THEN 'Motorbikes' ELSE ColumnA END AS ColumnA, SUM(ColumnB) AS ColumnB FROM grouped_result GROUP BY CASE WHEN ColumnA LIKE 'Motorbike%' THEN 'Motorbikes' ELSE ColumnA END;
说明
- 用
LIKE 'Motorbike%'比LEFT(ColumnA,9)更灵活,无需固定前缀长度;如果确定前缀长度固定,也可以替换成LEFT(ColumnA,9) = 'Motorbike'。 - 操作时机:直接从原表处理是在第一次分组时就定义合并规则,避免二次分组的额外计算;若只能基于已分组结果操作,才需要执行二次分组。
内容的提问来源于stack exchange,提问作者sapolopo
相关产品推荐
相关产品推荐

