如何用Snowflake SQL按列中唯一值将多行合并为一行?
Snowflake SQL 按列A唯一值合并多行方案
根据你的需求,以下是两种符合场景的Snowflake SQL实现方式,均无需创建新表,直接在原表上操作:
1. 合并同组列值为字符串(逗号分隔)
如果目标是将同一列A对应的其他列(如B、C)的多行值合并为单个字符串(匹配截图右侧的合并样式),使用Snowflake内置的LISTAGG聚合函数即可:
SELECT A, -- 合并B列值,用逗号+空格分隔,按B值排序 LISTAGG(B, ', ') WITHIN GROUP (ORDER BY B) AS merged_B, -- 合并C列值,同理 LISTAGG(C, ', ') WITHIN GROUP (ORDER BY C) AS merged_C FROM your_table GROUP BY A;
说明:
LISTAGG(col, separator):将分组内的col列值拼接为字符串,separator指定分隔符WITHIN GROUP (ORDER BY ...):控制拼接值的顺序,可根据需求调整排序字段
2. 行转置为多列(固定列数)
如果右侧表格是将同一列A的多行数据转置为同一行的多列(如B_1、B_2、C_1、C_2这类形式),可以结合ROW_NUMBER()和PIVOT实现:
假设每个A最多对应3行数据,示例SQL:
SELECT * FROM ( -- 先给每个A分组内的行分配序号 SELECT A, B, C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY B) AS row_seq FROM your_table ) -- 按行序号转置列 PIVOT ( MAX(B) AS b_col, MAX(C) AS c_col FOR row_seq IN (1 AS row1, 2 AS row2, 3 AS row3) );
说明:
ROW_NUMBER() OVER (PARTITION BY A ...):为每个A分组内的行生成唯一序号PIVOT:将不同序号的行转成列,MAX()作为聚合函数(同一序号下每个A仅对应一个值,聚合不影响结果)- 若需支持动态列数(不确定每个A对应多少行),需使用Snowflake存储过程或动态SQL实现静态PIVOT无法覆盖的场景
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

