我有一个与用户关联的事件表
我想知道是否可以编写一个sql查询,选择创建事件的用户,最后3个事件的状态是“canceled”
not count(),其中status='canceled',只有最后3行的status为canceled

Select u.* from users AS u
Right Join events as e ON e.user_id = u.id
WHERE {last 3 rows have e.status = 'canceled'}
Order by e.created_at
Group by u.id

事件表:
user_id, status, created_at
1, 'canceled', 2017-04-21
1, 'finished', 2017-04-20
1, 'finished', 2017-04-19
1, 'canceled', 2017-04-18
1, 'canceled', 2017-04-17
2, 'canceled', 2017-04-21
2, 'canceled', 2017-04-20
2, 'canceled', 2017-04-19
2, 'finished', 2017-04-18
2, 'finished', 2017-04-17

最佳答案

可以使用窗口函数获取用户列表。有一种方法:

select e.user_id
from (select e.*,
             row_number() over (partition by e.user_id order by created_at desc) as seqnum
      from event e
     ) e
where seqnum <= 3 and e.status = 'canceled'
group by e.user_id
having count(*) = 3;

查询从末尾枚举事件,然后统计取消的数目。
您可以通过重新加入users(或使用inexists)来获取其他用户信息。

10-07 15:07