2017-07-27 1 views
0

Das fühlt sich an wie ein Lücken- und Inseln-Problem und Fensterfunktionen scheinen das richtige Werkzeug zu sein, aber ich kann kein funktionierendes Ergebnis erzielen.Die Zeilen finden, die zu einem Ereignis führen und sie als Sequenz behandeln

Meine Daten sieht wie folgt aus (Hinweis: GameID eine UUID ist und hier als Zähler zur besseren Lesbarkeit dargestellt):

GameID User Date  Win 

    100  A 10/11/2012 0 
    101  A 10/12/2012 0 
    102  B 10/11/2012 0 
    103  B 10/13/2012 1 
    104  B 10/14/2012 0 
    105  C 10/10/2012 0 
    106  C 10/12/2012 0 
    107  C 10/13/2012 1 
    108  C 10/14/2012 0 
    109  C 10/15/2012 0 
    110  C 10/16/2012 0 
    111  C 10/17/2012 1 
    112  D 10/11/2012 0 
    113  D 10/13/2012 1 
    114  D 10/20/2012 0 
    115  D 10/21/2012 0 

Ich bin auf der Suche zu erfassen (Anzahl/Aggregat in Array), um die Folge von Verlusten Ein Benutzer hat vor jedem Gewinn. Wenn Sie zum Beispiel Benutzer B betrachten, haben sie einen Gewinn, dieser Gewinn hat einen Verlust davor. Wenn Sie sich Benutzer C ansehen, gehen dem Gewinn mit ID 107 zwei Verluste voraus und dem Gewinn mit ID 111 gehen 3 Verluste voraus.

Ich bin auf Array-Aggregation array_agg anwenden und die vorhergehenden verliert an einen Sieg anhängen. Letztlich möchte ich folgendes Ergebnis:

GameID User Date  Win LosingStreak 


    103  B 10/13/2012 1 [102] 
    107  C 10/13/2012 1 [105, 106] 
    111  C 10/17/2012 1 [110,109,108] 
    113  D 10/13/2012 1 [112] 

Ich habe mit partition by User order by date zu spielen, aber ich brauche, um bei einem Sieg jede Partition „Reset“ und ich kann nicht meinen Kopf zu wickeln scheinen um jede Möglichkeit, es zu lösen. lead() und lag() sind auch keine Hilfe, weil ich die lead (x) brauche, wobei x für jede Partition eine variable Zahl ist.

Antwort

1

Hmmm. Sie können die Gruppen anhand einer umgekehrten Summe der Gewinne identifizieren. Dann machen Sie einfach die Aggregation:

select t.user, max(t.date) as date, 
     max(case when win = 1 then gameid end) as gameid, 
     array_agg(gameid order by date asc) filter (where win = 0) as gameid_losses 
from (select t.*, 
      sum(wins) over (partition by user order by date desc) as grp 
     from t 
    ) t 
group by user, grp; 
+0

Sehr schlau. Vielen Dank. – maxTrialfire

Verwandte Themen