有效地找到"隔离" sql

时间:2016-08-17 08:49:24

标签: sql impala memory-efficient

假设我们有一个包含以下架构的表:

| 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天后没有来自用户的操作)

2 个答案:

答案 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部分确保您还可以获得结果集中的最新用户记录,因为很明显它之后没有日期。