Аналитическая функция Vertica для подсчета экземпляров в окне - PullRequest
1 голос
/ 18 июня 2019

Допустим, у меня есть набор данных с двумя столбцами: ID и timestamp.Моя цель - подсчитать идентификаторы возврата, которые имеют хотя бы n временных меток в любом 30-дневном окне.

Вот пример:

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'

Итак, допустим, я хочу вернуть список идентификаторов с 3 временными метками в любом 30-дневном окне.

Данный вышемой набор результатов будет просто ID = 1. Я думаю, что какая-то оконная функция могла бы достичь этого, но я не уверен.

Можете ли вы помочь мне написать запрос, который выполняет это?

1 Ответ

1 голос
/ 18 июня 2019

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