2017-03-20 3 views
1

Ich brauche eine Zählung für jeden Benutzer für jedes Mal, wenn das Aktionsfeld auf den Wert 1 geändert wurde. Wenn der erste Eintrag 1 ist, zählt das auch. Die Zeilen sind nicht in Ordnung, sollten aber in der Reihenfolge nach action_date gezählt werden.Fensterfunktion innerhalb der Gruppe von in PostgreSQL

Mit anderen Worten, was ich glaube getan werden muss, ist: gruppieren Sie die Zeilen von user_id, ordnen Sie sie nach Zeitstempel, und zählen Sie dann, wie oft Aktion = 1 und Aktion! = Die vorherige Zeile.

Beispiel

create table t (
user_id int, 
action_date timestamp, 
action int 
); 

Insert into t(user_id, action_date, action) 
values 
(1, '2017-01-01 00:00:00', 1), 
(2, '2017-01-01 00:00:00', 0), 
(1, '2017-01-03 00:00:00', 1), 
(2, '2017-01-03 00:00:00', 0), 
(1, '2017-01-02 00:00:00', 1), 
(2, '2017-01-02 00:00:00', 1), 
(1, '2017-01-04 00:00:00', 1), 
(2, '2017-01-04 00:00:00', 1); 

Das Ergebnis sollte

user_id | count 
---------+------- 
     1 |  1 
     2 |  2 

Mit Hilfe von this Antwort ich auf diese Weise die Ergebnisse für ein einzelnes Konto bekommen,

select user_id, count(*) 
from (select user_id, action_date,action,lag(action) over(order by action_date) as prev_action 
     from t where user_id=2 
    ) t 
where (action<>prev_action and action=1) or (action=1 and prev_action is null) 
group by user_id; 

aber stehe fest, versuche es zu allen uns zu erweitern ers.

Antwort

2

Verwenden Sie die lag() Funktion mit partition by:

select user_id, count(*) 
from (select t.*, 
      lag(action) over (partition by user_id order by action_date) as prev_action 
     from t 
    ) t 
where (action = 1) and (prev_action is distinct from 1) 
group by user_id; 
+0

ich die folgenden Störung erhalte, wenn ich versuche, diese '' 'ERROR: Syntaxfehler bei oder in der Nähe "(" LINE 3: Verzögerung (Aktion) über (partition by user_id order by ... '' ' – rurp

+0

Vielen Dank für diese elegante Antwort, es funktioniert perfekt. – rurp

Verwandte Themen