2016-04-08 3 views
1

Also nehme ich eine Tabelle wie folgt:generieren zyklischen Spaltenvariable abhängig Verzögerung einer anderen Variablen postgreSQL

user date 
    a  10/15/2015 
    a  11/15/2015 
    a  12/15/2015 
    a  2/15/2015 
    b  1/15/2015 
    b  2/15/2015 
    b  4/15/2015 
    b  6/15/2015 

ich drei Spaltenvariablen erstellen müssen (acutally zwei - ich dachte, die Zeitverzögerung variabel) (1) eine, die die Anzahl der aufeinander folgenden Logins nach Monat zählt und wenn es einen Fehler gibt, startet den Zähler (2) die Anzahl der Tage zwischen Logins (diese ist out) (3) wenn der Zähler zurückgesetzt wird, erhöht sich die Anzahl der Zyklen um eins. Die resultierende Tabelle soll wie folgt aussehen: (Ich werde nur zu Veranschaulichungszwecken 30 Tage für 1 Monat Spanne verwenden.)

user date   count  timelapse cycle 
    a  10/15/2015 1   0   1 
    a  11/15/2015 2   30   1 
    a  12/15/2015 3   30   1 
    a  2/15/2015 1   60   2 
    b  1/15/2015 1   0   1 
    b  2/15/2015 2   30   1 
    b  4/15/2015 1   60   2 
    b  6/15/2015 1   60   3 

Irgendwelche Ideen? Ich war in der Lage, die Zählungsspalte zum Funktionieren zu bringen - aber ich konnte es nicht zurückbekommen, wenn der Timelapse größer als 30 war. Da der Zyklus von zwei Spalten abhängig war, war ich dort ein wenig Verlust.

Jede Hilfe oder Ideen würde sehr geschätzt werden.

+0

Sie sollten die Abfrage zeigen, dass die fünfte Spalte behandelt. Und, können Sie mehr als einen Rekord in einem Monat haben? –

Antwort

0

Hier ist die Idee. Verwenden Sie lag(), um festzustellen, wann eine Lücke auftritt. Sie können dies tun, indem Sie das Datum für Vergleichszwecke auf den Anfang des Monats kürzen.

Dann eine kumulative Summe der Lückenflags erstellen. Dies liefert die cycle Spalte. Die Zahl ist dann row_number() die cycle mit:

select t.*, 
     row_number() over (partition by user, cycle order by date) as count 
from (select t.*, sum(IsGap) over (partition by user order by date) as cycle 
     from (select user, date, 
        (case when date_trunc('month', date) = date_trunc('month', lag(date) over (partition by user order by date) + interval '1 month' 
         then 0 
         else 1 
        end) as IsGap 
      from t 
      ) t 
    ) t 
+0

Das hat hervorragend funktioniert. Vielen Dank. – windsormatic

Verwandte Themen