使用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;