2016-09-27 4 views
0

In Python (Pandas) lese ich aus meiner Datenbank und dann verwende ich eine Pivot-Tabelle, um Daten jeden Tag zu aggregieren. Die Rohdaten, an denen ich arbeite, sind etwa 2 Millionen Zeilen pro Tag und das pro Person und pro 30 Minuten. Ich aggregiere es stattdessen täglich, so dass es viel kleiner für die Visualisierung ist.Looping durch eindeutige Datumsangaben in PostgreSQL

Also in Pandas, würde ich jedes Datum in den Speicher lesen und aggregieren und dann in eine neue Tabelle in Postgres laden.

Wie kann ich das direkt in Postgres tun? Kann ich jedes eindeutige report_date in meiner Tabelle, groupby, durchlaufen und an eine andere Tabelle anhängen? Ich gehe davon aus, es in Postgres zu tun wäre schnell verglichen mit dem Lesen über ein Netzwerk in Python, Schreiben einer temporären CSV-Datei, und dann wieder über das Netzwerk schreiben.

Antwort

1

Hier ist ein Beispiel: Nehmen wir an, Sie haben eine Tabelle,

CREATE TABLE post (
    posted_at timestamptz not null, 
    user_id integer not null, 
    score integer not null 
); 

repräsentieren die Gäste verschiedene Benutzer haben von den Pfosten verdient sie in SO wie Forum gemacht. Dann wird die folgende Abfrage

SELECT user_id, posted_at::date AS day, sum(score) AS score 
FROM post 
GROUP BY user_id, posted_at::date; 

die Ergebnisse pro Benutzer pro Tag aggregieren.

Beachten Sie, dass der Tag sich um 00:00 UTC ändert (wie SO). Wenn Sie eine andere Zeit wollen, sagen Mitternacht Pariser Zeit, dann kann man es wie so tun:

SELECT user_id, (posted_at AT TIME ZONE 'Europe/Paris')::date AS day, sum(score) AS score 
FROM post 
GROUP BY user_id, (posted_at AT TIME ZONE 'Europe/Paris')::date; 

für die oben genannten Abfragen gute Performace zu haben, Sie könnten einen (berechneten) Index auf (user_id, posted_at::date) erstellen möchten, oder ähnlich für den zweiten Fall.