使用SQL对事件之后发生的另一个事件进行计数
我有一个表,其中有列使用SQL对事件之后发生的另一个事件进行计数,sql,postgresql,Sql,Postgresql,我有一个表,其中有列uid=user\u id,pid=product\u id,events和timestamp。我必须计算每个产品的总事件数。有两种方法可以对事件进行计数,然后对两个结果求和 事件C将根据uid和pid直接计数 然后我还要计算事件A,只有在事件B是 接着是事件A 上面显示的数据是手动创建的,以最好地描述我的场景,它可能并不完全符合真实世界的数据 编辑:-结果应如下所示。我试图显示每个产品的事件数 pid #event 001 1 003 1 004
uid=user\u id
,pid=product\u id
,events
和timestamp
。我必须计算每个产品的总事件数。有两种方法可以对事件进行计数,然后对两个结果求和
事件C将根据uid和pid直接计数
然后我还要计算事件A,只有在事件B是
接着是事件A
上面显示的数据是手动创建的,以最好地描述我的场景,它可能并不完全符合真实世界的数据
编辑:-结果应如下所示。我试图显示每个产品的事件数
pid #event
001 1
003 1
004 0
005 0
006 2
009 0
010 0
011 1
这是小提琴:
提前谢谢你的帮助 我想你想要lag()
:
编辑:
你说你想要这个“每个产品”,然后把它们加起来。我认为这有点像:
select pid,
count(*) filter (where event = 'C' or event = 'B' and prev_event = 'A') as cnt
from (select t.*,
lag(event) over (partition by pid, uid order by timestamp) as prev_event
from t
) t
group by pid;
请显示您想要的结果。编辑后添加了预期结果。谢谢。结果还应根据产品id(pid)进行区分。我将通过添加pid进行测试,并将回复。Thanks@user2816085 . . . 第二个查询应该执行您想要的操作。
select uid,
count(*) filter (where event = 'C') as cnt_c,
count(*) filter (where event = 'B' and prev_event = 'A') as cnt_ab
from (select t.*,
lag(event) over (partition by uid order by timestamp) as prev_event
from t
) t
group by uid;
select pid,
count(*) filter (where event = 'C' or event = 'B' and prev_event = 'A') as cnt
from (select t.*,
lag(event) over (partition by pid, uid order by timestamp) as prev_event
from t
) t
group by pid;