如何在Redshift中转置指定列并追加到原表?
转置SQL表实现按id/date聚合、month为列的结构
针对你提供的临时表,这里提供两种实现转置的方法:
方法1:条件聚合(通用无依赖)
这种方法不需要额外扩展,通过CASE语句结合聚合函数实现转置,适用于已知month取值范围的场景:
SELECT id, date, MAX(CASE WHEN month = 1 THEN cost END) AS month_1, MAX(CASE WHEN month = 2 THEN cost END) AS month_2, MAX(CASE WHEN month = 3 THEN cost END) AS month_3, MAX(CASE WHEN month = 4 THEN cost END) AS month_4, MAX(CASE WHEN month = 5 THEN cost END) AS month_5, MAX(CASE WHEN month = 6 THEN cost END) AS month_6, MAX(CASE WHEN month = 7 THEN cost END) AS month_7 FROM x GROUP BY id, date ORDER BY id;
执行后会得到每个id和date对应一行,month_1到month_7列分别对应各月份的cost值,没有对应数据的列会显示NULL。
方法2:使用crosstab函数(PostgreSQL专属)
如果使用PostgreSQL,可以借助tablefunc扩展提供的crosstab函数实现更简洁的转置:
- 先启用
tablefunc扩展(只需执行一次):
CREATE EXTENSION IF NOT EXISTS tablefunc;
- 执行转置查询:
SELECT * FROM crosstab( 'SELECT id, date, month, cost FROM x ORDER BY id, date, month', 'SELECT DISTINCT month FROM x ORDER BY month' ) AS ct( id integer, date date, month_1 integer, month_2 integer, month_3 integer, month_4 integer, month_5 integer, month_6 integer, month_7 integer ) ORDER BY id;
这个方法会自动根据month的唯一值生成对应的列,结果和方法1一致。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

