2017-07-14 3 views
1

Ich habe meine Daten haben wie folgt:Wie Zeilennummern in Bezug auf einen Wert in einer Gruppe

Pagetype member_id created_at rownum  
    A   2   date   1    
    B   2   date   2    
    C   2   date   3    
    D   4   date   1    
    B   4   date   2    
    R   4   date   3    
    B   13   date   1    
    S   13   date   2    
    B   13   date   3    

Und ich möchte eine andere Spalte, um es hinzuzufügen, wie folgt:

Pagetype member_id created_at rownum DesiredRownum 
    A   2   date   1   -1 
    B   2   date   2    0 
    C   2   date   3    1 
    D   4   date   1   -1 
    B   4   date   2    0 
    R   4   date   3    1 
    B   13   date   1    0 
    S   13   date   2    1 
    B   13   date   3    2 

Ich möchte diesem DesiredColumn immer den Wert 0 zuweisen, wenn PageType für eine gegebene member_id B ist. Alle Werte von PageType vor B für beliebige member_id sollten negative Werte zugewiesen werden, und alle Werte von PageType nach B für beliebige member_id sollten steigende positive Werte zugeordnet werden.

Die Abfrage habe ich meine Daten zu bekommen, ist wie folgt:

select pagetype, 
member_id, 
created_at, 
row_number() over(partition by member_id order by created_at) 
from table 
order by member_id, 
created_at 

Wie kann ich diese neue Spalte auf meine Daten hinzufügen?

EDIT: Geringfügige Änderung. Die PageType kann für jeden beliebigen Benutzer wiederholt werden. Zum Beispiel wiederholt sich die PageType B für member_id 13. In diesem Fall würden wir Werte für das erste Auftreten von B berechnen wollen.

Antwort

3

Nach der Berechnung der Zeilennummern können Sie den Wert für "B" erhalten und verwenden für die Berechnung:

select t.*, 
     (seqnum - 
     max(case when pagetype = 'B' then seqnum end) over (partition by member_id) 
     ) as b_diff 
from (select pagetype, member_id, created_at, 
      row_number() over (partition by member_id order by created_at) as seqnum 
     from table 
    ) t 
order by member_id, created_at 
+0

Ich habe nur eine kleine Änderung an der Frage gemacht. – Patthebug

+0

Sie sollten eine andere Frage stellen. –

Verwandte Themen