splitting rows in Redshift

寵の児 提交于 2020-03-16 06:48:04

问题


In my table the data is as below:

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

I need the output as below:

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

Im using Redshift DB.


回答1:


You're correct, Redshift currently doesn't support generate_series. One way to get around this is to generate your own series table and join to that. In my example below I just did a row_number() against the pg_attribute table to generate the sequence. You can adjust TOP (v) value to adjust now many numbers you want in your sequence, if you need more than what pg_attribute can give you, try cross joining pg_attribute with itself. I don't claim this to be the best way to generate a sequence table, you can generate it any way you want; my main point is that you'll need one to substitute for generate_series.

Once you have your series table, then its a simple join to get your result. Complete Example:

-- 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;


来源:https://stackoverflow.com/questions/22779150/splitting-rows-in-redshift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!