在Redshift中拆分行

时间:2014-04-01 07:13:23

标签: sql postgresql amazon-redshift

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

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。

1 个答案:

答案 0 :(得分:4)

你是对的,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;