PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

diviser des lignes dans Redshift

Vous avez raison, Redshift ne prend actuellement pas en charge generate_series. Une façon de contourner ce problème consiste à générer votre propre table de séries et à vous y joindre. Dans mon exemple ci-dessous, je viens de faire un row_number() contre la table pg_attribute pour générer la séquence. Vous pouvez ajuster la valeur TOP (v) pour ajuster maintenant de nombreux nombres que vous voulez dans votre séquence, si vous avez besoin de plus que ce que pg_attribute peut vous donner, essayez de joindre pg_attribute avec lui-même. Je ne prétends pas que ce soit la meilleure façon de générer une table de séquence, vous pouvez la générer comme vous le souhaitez ; mon point principal est que vous en aurez besoin pour remplacer generate_series.

Une fois que vous avez votre table de série, c'est une simple jointure pour obtenir votre résultat.Exemple complet :

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