如何在Snowflake中实现表转置?附示例数据
Snowflake行转列(宽表)解决方案
针对你给出的键值对格式数据,使用Snowflake原生的PIVOT语法可以高效完成转换,这是性能最优的原生解决方案。
静态列透视方案(适用于已知目标列的场景)
假设你的源表名为user_attributes,执行以下SQL即可得到目标格式:
SELECT * FROM user_attributes PIVOT ( MAX(value) FOR column_name IN ('Name', 'Age', 'City') ) AS pivoted_table ORDER BY user_id;
关键说明
MAX(value):由于每个user_id与column_name的组合仅对应一个值,使用MAX或MIN聚合函数都能准确提取对应值(Snowflake的PIVOT语法必须搭配聚合函数)。FOR column_name IN ('Name', 'Age', 'City'):指定需要转换为列的column_name取值,按目标输出的列顺序排列即可。- 结果会自动按
user_id分组,将每个column_name转为独立列并填充对应value值。
动态列透视方案(可选,适用于列不固定的场景)
如果column_name的取值不固定,可通过Snowflake动态SQL自动生成透视语句:
DECLARE cols STRING; BEGIN SELECT LISTAGG(DISTINCT '''' || column_name || ''' AS ' || column_name, ', ') INTO cols FROM user_attributes; EXECUTE IMMEDIATE ' SELECT * FROM user_attributes PIVOT ( MAX(value) FOR column_name IN (' || cols || ') ) AS pivoted_table ORDER BY user_id '; END;
该方案会自动获取所有唯一的column_name并生成对应的透视列,无需手动指定列名。
内容的提问来源于stack exchange,提问作者Peter Nagel
相关产品推荐
相关产品推荐

