红移。我们如何(动态地)将表从列转置为行?
Posted
技术标签:
【中文标题】红移。我们如何(动态地)将表从列转置为行?【英文标题】:Redshift. How can we transpose (dynamically) a table from columns to rows? 【发布时间】:2018-09-04 21:59:31 【问题描述】:我们如何将 Redshift 表从列转换为行?
例如,如果我们有一个通用(未知)表,如下所示:
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
when
映射需要,因为我们想将其应用于多个不同的表)。
但我们将在所有目标表中都有日期和 id 字段(或者最后在所有表中都有主键或候选键)。
我们的 Redshift 版本是:
PostgreSQL 8.0.2, Redshift 1.0.3380
我们该怎么做?
【问题讨论】:
我遇到了同样的问题,除了源数据来自 API,最终创建了一个 python 脚本来旋转或转置数据集。 哼。也许可以创建一个 python 函数来创建某种动态查询。但我不知道是否有可能使用类似select * from pivot_function('schema_name', 'table_name', 'table_id_column_name');
Redshift UDF 无法访问表数据。
【参考方案1】:
您需要将列名硬编码到查询中。
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
【讨论】:
以上是关于红移。我们如何(动态地)将表从列转置为行?的主要内容,如果未能解决你的问题,请参考以下文章