按属性,postgres获取最后5行

时间:2017-04-21 12:01:18

标签: sql postgresql

我有一个与用户关联的事件表 我想知道是否可以编写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

1 个答案:

答案 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(或使用inexists)获取其他用户信息。