在 Redshift 中拆分行

Posted

技术标签:

【中文标题】在 Redshift 中拆分行【英文标题】:splitting rows in Redshift 【发布时间】:2014-04-01 07:13:22 【问题描述】:

在我的表格中,数据如下:

col1    col2    col3    col4
A1      A2      A3      4
B1      B2      B3      3   
C1      C2      C3      1

我需要如下输出:

col1    col2    col3    col4
A1      A2      A3      1
A1      A2      A3      2
A1      A2      A3      3
A1      A2      A3      4
B1      B2      B3      1   
B1      B2      B3      2   
B1      B2      B3      3   
C1      C2      C3      1

我正在使用 Redshift DB。

【问题讨论】:

感谢您具体说明您正在使用 Redshift(因此大多数常用解决方案都不适用)。您如何从输入到预期输出背后的逻辑(用文字表示)是什么?它看起来像 对于 col4=n,重复 col1、col2 和 col3 n 次,产生像 (col1, col2, col3, 1 .. n) 之类的元组 ...在这种情况下你想加入generate_series。如果你可以在 Redshift 中做到这一点。 (当亚马逊向sqlfiddle.com 捐赠一个 Redshift 帐户时,我将开始回答 Redshift 问题,而不是在此之前)。 我试过generate_series Redshift 不支持它。 【参考方案1】:

你说得对,Redshift 目前不支持 generate_series。解决此问题的一种方法是生成您自己的系列表并加入该表。在下面的示例中,我只是针对 pg_attribute 表执行了 row_number() 以生成序列。您现在可以调整 TOP (v) 值来调整您想要的序列中的许多数字,如果您需要的数量超过 pg_attribute 所能提供的,请尝试将 pg_attribute 与其自身交叉连接。我不认为这是生成序列表的最佳方式,您可以以任何您想要的方式生成它;我的主要观点是你需要一个来代替 generate_series。

一旦有了系列表,就可以通过简单的连接来获得结果。 完整示例:

-- Setup Example
CREATE TABLE test
(
    col1 char(2),
    col2 char(2),
    col3 char(2),
    col4 integer
);

INSERT INTO test(col1, col2, col3, col4)
VALUES 
    ('A1', 'A2', 'A3', 4),
    ('B1', 'B2', 'B3', 3),
    ('C1', 'C2', 'C3', 1);


-- Generate 10 sequence numbers to table.  Adjust as needed or roll your own
SELECT TOP 10 ROW_NUMBER() OVER (PARTITION BY attnum ORDER BY attnum) n
INTO sequence
FROM pg_catalog.pg_attribute;

-- Example Query
SELECT col1, col2, col3, s.n
FROM test t
     INNER JOIN sequence s ON s.n <= t.col4
ORDER BY col1, col2, col3, s.n;

-- Clean up
DROP TABLE sequence;
DROP TABLE test;

【讨论】:

以上是关于在 Redshift 中拆分行的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中拆分一个 varchar 列

拆分文件 - Redshift 复制命令

Redshift :- 易于将逗号分隔的字符串拆分为行

如何将拆分的 gzip 文件中的数据加载到 redshift 中?

Redshift - 将数据拆分为多行

在 Redshift 中将 json-format 列拆分为多个列