假设我们有一个包含以下架构的表:
| ID | DATE | VALUE |
| ------------- |:-------------:| -----:|
| 1 | '2016-08-01' | 1600 |
| 9 | '2016-03-03' | 12 |
| 1 | '2016-08-21' | 1 |
| 4 | '2016-09-01' | 1 |
| .... .... .... |
如何有效地查找表格在行日期后的N天内不包含具有相同ID的记录的所有行?
简单地说,目标是找到"最后一个动作"对于每个用户(至少 N天后没有来自用户的操作)
答案 0 :(得分:2)
听起来很清楚:)
SELECT *
FROM mytable t1
WHERE NOT EXISTS (
SELECT id
FROM mytable t2
WHERE
t2.date > t1.date AND
t2.date < t1.date + '30days'::interval AND
t1.id = t2.id
)
当然,您必须将语法(尤其是与日期相关的)与目标数据库匹配。
答案 1 :(得分:1)
您可以使用lead
窗口功能。这比使用相关子查询更好:
select *
from ( select id, date, value,
lead(date) over (partition by id order by date) next_date
from mytable ) as detail
where date < date_sub(next_date, 30) or next_date is null
这假设您的日期字段是时间戳。如果是字符串,则使用datediff
。
请注意,next_date is null
部分确保您还可以获得结果集中的最新用户记录,因为很明显它之后没有日期。