查找导致事件发生的行并将它们视为一个序列
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;
这感觉像是一个差距和孤岛问题,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;