我有一个与用户关联的事件表 我想知道是否可以编写SQL查询,选择创建事件的用户,最后3个事件的状态为“已取消”
not count()where status ='cancelled',仅限最后3行取消状态的地方
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
答案 0 :(得分:3)
您可以使用窗口函数获取用户列表。这是一种方法:
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
(或使用in
或exists
)获取其他用户信息。