2017-07-27 63 views
0

這感覺就像一個間隙和島嶼問題,窗口函數看起來像是正確的工具,但我似乎無法得到一個工作結果。尋找導致事件發生的行並將它們視爲一個序列

我的數據是這樣的(注:遊戲ID是一個UUID,在這裏顯示爲可讀性計數器):

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 

我期待捕捉(數/聚合成數組)的損失序列用戶在每次勝利之前都有。舉例來說,如果你看看用戶B他們有一場勝利,那勝利在它之前有一個損失。如果你看看用戶C,ID 107的勝利前面有兩個損失,而ID 111的勝利前面有3個損失。

我期待應用數組聚合array_agg並將前面的損失附加到贏。最後,我想下面的結果:

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] 

我一直在玩partition by User order by date但我需要一場勝利來「重置」的每個分區,我似乎無法環繞解決它的任何方式我的頭。 lead()和lag()也沒有幫助,因爲我需要lead(x),其中x是每個分區的可變數字。

回答

1

嗯。您可以使用勝利的反向總和來識別組。然後,只要做聚合:

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

非常聰明。非常感謝。 – maxTrialfire

相關問題