PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

dividere le righe in Redshift

Hai ragione, Redshift attualmente non supporta generate_series. Un modo per aggirare questo problema è generare la tua tabella di serie e unirti a quella. Nel mio esempio di seguito ho appena eseguito un row_number() rispetto alla tabella pg_attribute per generare la sequenza. Puoi regolare il valore TOP (v) per regolare ora molti numeri che vuoi nella tua sequenza, se hai bisogno di più di quello che pg_attribute può darti, prova a unire pg_attribute con se stesso. Non pretendo che questo sia il modo migliore per generare una tabella di sequenza, puoi generarlo come preferisci; il mio punto principale è che ne avrai bisogno per sostituire generate_series.

Una volta ottenuta la tabella della serie, è sufficiente unire per ottenere il risultato. Esempio 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;