查找导致事件发生的行并将它们视为一个序列

Finding the rows leading up to an event and treating them as a sequence

这感觉像是一个差距和孤岛问题,window 函数似乎是正确的工具,但我似乎无法得到有效的结果。

我的数据如下所示(注意:GameID 是一个 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

我希望捕获(count/aggregate 到数组中)用户在每次获胜之前的损失序列。因此,例如,如果您查看用户 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 但我需要 "reset" 每个分区都赢了,我似乎无法想出任何解决方法。 lead() 和 lag() 也没有帮助,因为我需要 lead(x),其中 x 是每个分区的可变数字。

嗯。您可以使用获胜的反向总和来识别组。然后,就做聚合:

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;