Относительно простой способ сделать это включает 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
s, тогда:
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;