sql - Postgres:查询 created_at 时间相差 < 1 秒的用户的最近 2 条记录?
问题描述
我有一张桌子
create table Account(
userId: INT NOT NULL,
status: TEXT NOT NULL,
created_at: TIMESTAMP NOT NULL
)
AuserId
可以有多个帐户,状态可以是ACTIVE
或CANCELLED
。我希望最新的帐户是ACTIVE
并且用户只有 1 ACTIVE account
。目前有userIds
一个ACTIVE
帐户,但用户的最新帐户是CANCELLED
,这些是我要识别的帐户。
是否有查询来查找最近的 2 个帐户(created_at
其中一个是活动的,另一个是取消的(或任何其他文本)。
解决方案
我会使用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'
推荐阅读
- ruby-on-rails - 如何配置 capistrano 以在一台服务器上部署 puma 和 nginx 并在另一台服务器上部署 resque?
- javascript - 警报返回url路径,而jquery中的警报变量
- java - 迁移到 androidx 后类似 onBackPressed() supportActionBar() 导入错误的功能
- python - 将列表的字符串表示形式转换为字典 Python
- macos - 在 Mac OS X 上使用快捷键关闭当前 WebStorm 实例?
- c# - Git,一个解决方案中的两个存储库
- android - 如何在android中播放m3u文件?
- api - 从 openshift 调用 API 的 IP/主机名白名单方式
- javascript - 修复了滚动时的侧边栏,然后在向上滚动时恢复正常
- scala - Spark reduce 功能导致“错误类型不匹配”