首页 > 解决方案 > Postgres:查询 created_at 时间相差 < 1 秒的用户的最近 2 条记录?

问题描述

我有一张桌子

create table Account(
  userId: INT NOT NULL,
  status: TEXT NOT NULL,
  created_at: TIMESTAMP NOT NULL
)

AuserId可以有多个帐户,状态可以是ACTIVECANCELLED。我希望最新的帐户是ACTIVE并且用户只有 1 ACTIVE account。目前有userIds一个ACTIVE帐户,但用户的最新帐户是CANCELLED,这些是我要识别的帐户。

是否有查询来查找最近的 2 个帐户(created_at其中一个是活动的,另一个是取消的(或任何其他文本)。

标签: sqlpostgresql

解决方案


我会使用lag()distinct on获取最新状态:

select distinct on (user_id) a.*
from (select a.*,
             lag(status) over (partition by user_id order by created_at) as prev_status
      from account a
     ) a
order by user_id, created_at desc;

如果您想要那些被取消但立即处于活动状态的那些,请使用子查询:

select a.*
from (select distinct on (user_id) a.*
      from (select a.*,
                   lag(status) over (partition by user_id order by created_at) as prev_status
            from account a
           ) a
      order by user_id, created_at desc
     ) a
where status = 'CANCELLED' and prev_status = 'ACTIVE'

推荐阅读