如何在Amazon Redshift中合并通用标识对应的多行数据
在Amazon Redshift中合并同一通用标识的多行属性
这场景我太熟悉了!你要的其实是行转列(多行合并为单行,保留原属性列),而且要适配大量属性的情况,不用逐个写复杂逻辑对吧?
核心解决方案:用GROUP BY + 聚合函数忽略NULL
因为同一Common ID下每个属性列只有一个非空值,剩下的都是NULL,我们可以利用Redshift的聚合函数(比如MAX()或MIN())自动忽略NULL的特性,直接提取每个属性的有效值,同时按Common ID分组合并行。
示例SQL代码
假设你的表名为attribute_table,直接用下面的写法,不管有多少个属性列,只要复制对应格式就行:
SELECT "Common ID", MAX("Attribute 1") AS "Attribute 1", MAX("Attribute 2") AS "Attribute 2", -- 这里依次添加剩下的属性列,比如: MAX("Attribute 3") AS "Attribute 3", MAX("Attribute 4") AS "Attribute 4", -- ... 直到所有20个属性列都列出来 MAX("Attribute 20") AS "Attribute 20" FROM attribute_table GROUP BY "Common ID" ORDER BY "Common ID";
为什么这个方法好用?
- 适配任意数量的属性:不管是2个还是20个属性,只要对每个属性列重复
MAX(列名) AS 列名的格式就行,不用写复杂的CASE语句或者动态SQL。 - 完美保留原列结构:和你要的输出格式完全一致,不会像
LISTAGG那样把值拼接成单个列。 - 高效且稳定:Redshift对GROUP BY和MAX/MIN的优化非常好,即使数据量较大也能快速执行,而且不管属性是字符串、数字还是日期类型,MAX/MIN都能正确提取非空值(同一ID下每个属性只有一个有效值,MAX和MIN结果一样)。
补充说明
如果你的属性列存在特殊情况(比如同一ID下某个属性有多个非空值),那可能需要先做去重处理,但根据你的描述“同一标识最多可能出现20次”且“每行仅填充一个属性”,这个方法完全适用。
内容的提问来源于stack exchange,提问作者Nilly
相关产品推荐
相关产品推荐

