2017-04-10 5 views
0

Ich verwende date_trunc, um über ein Zeitstempelfeld zu aggregieren. Ich versuche, die Anzahl der eindeutigen Werte in einem bestimmten Feld über einen Monat zu zählen. Wenn ich month als meine Auflösung wählen:Rollender Durchschnitt mit date_trunc

SELECT date_trunc('month', timestamp), COUNT(DISTINCT(foo)) FROM ... 

dann alle resultierenden Einträge sind zu Beginn eines jeden Monats, und so „2017.01.01" würden die eindeutigen Einträge werden zu zählen, wo das timestamp Feld überall im Januar .

gibt es eine Möglichkeit ein Offset angeben, so dass ich bei 2017.01.15 einen Eintrag haben könnte, mit Einträgen bis zu 2017.02.15?

Dank.

+1

Beispieldaten. erwartete Ausgabe. –

Antwort

0
SELECT 
    date_trunc('month', timestamp + interval '15 day'), 
    COUNT(DISTINCT(foo)) 
FROM ... 
group by 1 
0

Diese Art von Abfragen sind nie sehr effizient. Wenn Geschwindigkeit ein Problem ist, ist es besser, dies außerhalb der Datenbank durch Schleifen in der Anwendungssprache zu tun.

In der Unterabfrage generieren wir für jeden Datensatz eine Reihe von Daten, die sie in ihre Aggregationen einschließen. dann aggregieren wir nach den generierten Daten.

SELECT 
    mydate 
    , COUNT(DISTINCT foo) 
FROM (SELECT GENERATE_SERIES(DATE("timestamp") - INTERVAL '30 DAYS' 
          , DATE("timestamp"), '1 DAY') mydate 
      , foo 
     FROM mytable) expanded 
GROUP BY 1 

Versuchen Sie auch, bitte als Typ eines postgresql Daten NICHT timestamp als Spaltennamen zu verwenden.

Verwandte Themen