Вы можете использовать lag()
, чтобы получить предыдущую временную метку для пользователя.Если текущая и предыдущая временная метка разделены меньше или ровно через три дня, это продолжение.Отметьте строку как таковую.Затем вы можете отфильтровать, чтобы исключить последующие действия.
Это может выглядеть примерно так:
SELECT month,
count(*) unique_fails
FROM (SELECT month(fail_date) month,
CASE
WHEN datediff(day,
lag(fail_date) OVER (PARTITION BY user_id,
ORDER BY fail_date),
fail_date) <= 3 THEN
1
ELSE
0
END follow_up
FROM elbat) x
WHERE follow_up = 0
GROUP BY month;
Я не совсем уверен насчет точного синтаксиса в Vertica, поэтому может потребоваться некоторая адаптация,Я также не знаю, является ли fail_date
на самом деле вариантом типа даты / времени или просто строкой.Если это просто строка, то функции, специфичные для даты и времени, могут не работать с ней и должны быть заменены, или строка должна быть преобразована перед передачей ее функциям.
Если данные охватывают несколько лет, вы также можетехотите включить год в дополнение к месяцу, чтобы отделить месяцы от разных лет.Во внутреннем SELECT
добавьте столбец year(fail_date) year
и добавьте year
к списку столбцов и GROUP BY
внешнего SELECT
.