假设我有一个包含两列的数据集:ID
和timestamp
。我的目标是在任何30天的窗口中计算至少具有n个时间戳的返回ID。
这里是一个例子:
ID Timestamp
1 '2019-01-01'
2 '2019-02-01'
3 '2019-03-01'
1 '2019-01-02'
1 '2019-01-04'
1 '2019-01-17'
因此,假设我要返回一个在30天的时间范围内具有3个时间戳的ID的列表。
鉴于上面,我的结果集将只是ID =1。我在想某种窗口功能可以完成此任务,但我不是肯定的。
有没有机会您可以帮助我编写一个完成此任务的查询?
答案 0 :(得分:1)
一种相对简单的方法涉及lag()
/ lead()
:
select t.*
from (select t.*,
lead(timestamp, 2) over (partition by id order by timestamp) as timestamp_2
from t
) t
where datediff(day, timestamp, timestamp_2) <= 30;
lag()
查看系列中的第三个时间戳。 where
检查是否在原始日期的30天内。结果是发生这种情况的行。
如果只需要id
,则:
select distinct id
from (select t.*,
lead(timestamp, 2) over (partition by id order by timestamp) as timestamp_2
from t
) t
where datediff(day, timestamp, timestamp_2) <= 30;