PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aufteilen von Zeilen in Redshift

Sie haben Recht, Redshift unterstützt derzeit generate_series nicht. Eine Möglichkeit, dies zu umgehen, besteht darin, eine eigene Serientabelle zu erstellen und dieser beizutreten. In meinem Beispiel unten habe ich gerade eine row_number() gegen die pg_attribute-Tabelle ausgeführt, um die Sequenz zu generieren. Sie können den TOP (v)-Wert anpassen, um jetzt viele Zahlen anzupassen, die Sie in Ihrer Sequenz haben möchten. Wenn Sie mehr benötigen, als pg_attribute Ihnen geben kann, versuchen Sie, pg_attribute mit sich selbst zu verbinden. Ich behaupte nicht, dass dies der beste Weg ist, um eine Sequenztabelle zu generieren, Sie können sie so generieren, wie Sie möchten; Mein Hauptpunkt ist, dass Sie eine als Ersatz für generate_series benötigen.

Sobald Sie Ihre Reihentabelle haben, ist es ein einfacher Join, um Ihr Ergebnis zu erhalten. Vollständiges Beispiel:

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