PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

dividindo linhas no Redshift


Você está correto, o Redshift atualmente não suporta generate_series. Uma maneira de contornar isso é gerar sua própria tabela de séries e juntar-se a ela. No meu exemplo abaixo eu apenas fiz um row_number() na tabela pg_attribute para gerar a sequência. Você pode ajustar o valor TOP (v) para ajustar agora muitos números que você deseja em sua sequência, se você precisar de mais do que o pg_attribute pode lhe dar, tente cruzar o pg_attribute com ele mesmo. Não afirmo que esta seja a melhor maneira de gerar uma tabela de sequências, você pode gerá-la da maneira que quiser; meu ponto principal é que você precisará de um para substituir generate_series.

Uma vez que você tenha sua tabela de séries, então é uma junção simples para obter seu resultado. Exemplo Completo:
-- 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;