Dynamic 红移。我们如何(动态地)将表从列转换到行?
我们如何将红移表从列转置到行 例如,如果我们有一个通用(未知)表,如下所示:Dynamic 红移。我们如何(动态地)将表从列转换到行?,dynamic,pivot-table,multiple-columns,amazon-redshift,transpose,Dynamic,Pivot Table,Multiple Columns,Amazon Redshift,Transpose,我们如何将红移表从列转置到行 例如,如果我们有一个通用(未知)表,如下所示: source table: date id alfa beta gamma ... omega 2018-08-03 1 1 2 3 4 2018-08-03
source table:
date id alfa beta gamma ... omega
2018-08-03 1 1 2 3 4
2018-08-03 2 4 3 2 1
...
2018-09-04 1 3 1 2 4
...
我们如何才能达到以下结果
transposed table:
date id column_name column_value
2018-08-03 1 alfa 1
2018-08-03 1 beta 2
...
2018-08-03 2 omega 1
...
2018-09-04 1 gamma 2
...
在目标表中,列数(alfa、beta、gamma、…、omega)都是动态的(因此,我们正在寻找一种解决方案,在每个列需要映射时,不需要case,因为我们希望将其应用于几个不同的表)
但我们在所有目标表中都有和date和id字段(或者在所有表中最后都有主键或候选键)
我们的红移版本是:
PostgreSQL 8.0.2,红移1.0.3380
我们如何做到这一点?您需要将列名硬编码到查询中
CREATE TABLE stack(date TEXT, id BIGINT, alpha INT, beta INT, gamma INT, omega INT);
INSERT INTO STACK VALUES('2018-08-03', 1, 1, 2, 3, 4);
INSERT INTO STACK VALUES('2018-08-03', 2, 4, 3, 2, 1);
INSERT INTO STACK VALUES('2018-08-04', 1, 3, 1, 2, 4);
SELECT
date,
id,
col,
col_value
FROM
(
SELECT date, id, alpha AS col_value, 'alpha' AS col FROM stack
UNION
SELECT date, id, beta AS col_value, 'beta' AS col FROM stack
UNION
SELECT date, id, gamma AS col_value, 'gamma' AS col FROM stack
UNION
SELECT date, id, omega AS col_value, 'omega' AS col FROM stack
) AS data
ORDER BY date, id, col
结果:
2018-08-03 1 alpha 1
2018-08-03 1 beta 2
2018-08-03 1 gamma 3
2018-08-03 1 omega 4
2018-08-03 2 alpha 4
2018-08-03 2 beta 3
2018-08-03 2 gamma 2
2018-08-03 2 omega 1
2018-08-04 1 alpha 3
2018-08-04 1 beta 1
2018-08-04 1 gamma 2
2018-08-04 1 omega 4
我也遇到过同样的问题,只是源数据来自API,最终创建了一个python脚本来透视或转换数据集。哼。也许可以创建一个python函数来创建某种动态查询。但我不知道是否可以使用类似于
select*fromPivot_函数('schema_name','table_name','table_id_column_name')代码>红移UDF无法访问表数据。