2016-07-29 3 views
1

Ich muss eine leere Zeitreihe Serie für einen Bericht erstellen, so dass ich Join-Aktivität von mehreren Tabellen zu ihm lassen kann. Jede Stunde des Tages hat nicht unbedingt Daten, aber ich möchte, dass sie Null oder Null für Inaktivität anzeigt, anstatt diese Stunde des Tages auszulassen.REDSHIFT: Wie kann ich eine Reihe von Zahlen generieren, ohne eine Tabelle namens "Nummern" in Rotverschiebung (Postgres 8.0.2) zu erstellen?

In späteren Versionen von Postgres (Post 8.0.2), das in mehrfacher Hinsicht einfach:

SELECT unnest(array[0,1,2,3,4...]) as numbers

ODER

CROSS JOIN (select generate_series as hours from generate_series(now()::timestamp, now()::timestamp + interval '1 day', '1 hour'::interval )) date_series

Redshift können einige dieser Befehle ausführen, Es wird jedoch ein Fehler ausgegeben, wenn Sie versuchen, es in Verbindung mit einer der Tabellen auszuführen.

, was ich brauche:

zuverlässige Weise eine Reihe von Zahlen (z.B. 0-23) als Unterabfrage zu erzeugen, die auf Rotverschiebung (verwendet postgres 8.0.2) ausgeführt werden.

+0

http://StackOverflow.com/a/34167753/3019685 – systemjack

Antwort

4

Wie lange dauert vorstellen, wie Sie eine Tabelle, die mehr Zeilen als Ihre erforderlich ist Serie hat Zahlen, das hat für mich in der Vergangenheit funktioniert:

select 
    (row_number() over (order by 1)) - 1 as hour 
from 
    large_table 
limit 24 
; 

Welche gibt die Nummern 0-23 zurück.

+2

Dies ist eine vernünftige Lösung, und wenn ich etwas wie pg_catalog.pg_operator verwende, muss ich mich nicht darum kümmern, dass Schemaänderungen die Abfrage ruinieren. – darbarinyc

+0

Mit einer Systemtabelle, gute Idee! – moertel

0

Leider erlaubt Amazon Redshift keine Verwendung von generate_series() für Tabellenfunktionen. Die Problemumgehung scheint eine Tabelle mit Zahlen zu erstellen.

Siehe auch:

+0

Erstellen einer Tabelle von Zahlen ärgert mich auf eine sehr schreckliche Art und Weise. Es fühlt sich an, als würde man die Zahlen einzeln in einem Python-Skript schreiben. Es ist einfach falsch. – darbarinyc

+0

Sie könnten eine "Datum" -Tabelle mit Spalten wie "DayOfWeek", "PublicHoliday", "Month", "Quarter" usw. erstellen. Dies ist eine gängige Praxis, um nützliche Informationen aus Daten zu extrahieren. Dann könnten Sie diese Tabelle als "Zahlen" -Tabelle verwenden, ohne sich so ärgerlich zu fühlen. –

0

Ich bin kein großer Fan von Abfrage einer Systemtabelle, nur um eine Liste der Zeilennummern zu erhalten. Wenn es etwas konstant und klein genug, wie Stunden eines Tages ist, würde ich mit einfachen alten UNION ALL gehen:

WITH 
    hours_in_day AS (
    SELECT 0 AS hour 
    UNION ALL SELECT 1 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4 
    ... 
    UNION ALL SELECT 23 
) 

Und dann kommen hours_in_day, was auch immer Sie wollen.

+0

Ich hatte tatsächlich mehr Glück beim Abfragen einer sehr kleinen Tabelle und Auswählen von row_number() über(). Redshift spielt nicht gut mit wiederholten UNION ALL-Unterabfragen, und sogar für so wenig wie Stunden des Tages haben wir eine bessere Leistung mit row_number gesehen. – darbarinyc

Verwandte Themen