首页 > 解决方案 > 交叉连接用户表,为每个 id 添加一个“next_updated_at”

问题描述

我基本上想为每个 user_id 找到“next_updated_at”

用户表的重要字段是 user_id、id、updated_at

我的想法是尝试交叉连接 users 表以找到每个 user_id 的最小 updated_at ,其中连接表 id 大于主表 id

SELECT * FROM users m1

LEFT JOIN (
SELECT min(updated_at),user_id FROM users GROUP BY user_id
) m2 ON m2.user_id = m1.user_id AND m2.id > m1.id

但是子查询中不存在 id ......我有点难过

用户表

user_id     id  updated_at
12345       1   01-01-2018
12345       2   03-05-2018
11223       3   03-07-2018
33211       4   04-11-2018
11223       5   06-11-2018
11223       6   11-01-2018
33211       7   01-04-2019
33211       8   01-07-2019

所需查询

user_id     id  updated_at  next_updated_at
12345       1   01-01-2018  03-05-2018
12345       2   03-05-2018  
11223       3   03-07-2018  06-11-2018
33211       4   04-11-2018  01-04-2019
11223       5   06-11-2018  11-01-2018
11223       6   11-01-2018
33211       7   01-04-2019  01-07-2019
33211       8   01-07-2019

标签: sqlpostgresqlamazon-redshift

解决方案


使用lead()

SELECT u.*,
       LEAD(updated_at) OVER (PARTITION BY user_id ORDER BY updated_at, id) as next_updated_at
FROM users u;

我不确定您为什么要使用id. 似乎下一次更新将基于日期本身。我添加了id处理关系。


推荐阅读