红移。我们如何(动态地)将表从列转置为行?

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)都是动态的(所以我们正在寻找一种解决方案,即每个列都没有casewhen 映射需要,因为我们想将其应用于多个不同的表)。

但我们将在所有目标表中都有日期和 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

【讨论】:

以上是关于红移。我们如何(动态地)将表从列转置为行?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 表选择多列并将结果(列)动态转换为行 - 将列转置为行

oracle sql 11G中如何将列转置为行

oracle如何在没有UNION的情况下将列转置为行

如何从列转置到行?

使用交叉应用将列转置为行

使用 Spark 将列转置为行