2017-07-27 46 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

相关问题