impala—在sql中高效地查找“孤立”行

sgtfey8w  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(417)

假设我们有一个具有以下模式的表:

| 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天内用户没有任何操作)

jecbmhm3

jecbmhm31#

听起来很清楚:)

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
)

当然,您必须将语法(尤其是与日期相关的语法)与目标数据库相匹配。

xytpbqjk

xytpbqjk2#

你可以用这个 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 part确保您还可以获得结果集中最新的用户记录,因为很明显,它后面没有过快的日期。

相关问题