Вы можете использовать аналитическую функцию lag
, чтобы просмотреть в отсортированной последовательности отметок времени, чтобы увидеть, находится ли запись, поступившая на 19 записей раньше, с разницей в часах:
with cte as (
select user_id,
login_time,
lag(login_time, 19) over (partition by user_id order by login_time) as lag_time
from userlog
order by user_id,
login_time
)
select user_id,
min(login_time) as login_time
from cte
where extract(epoch from (login_time - lag_time)) < 3600
group by user_id
Вывод будетпоказать подходящих пользователей с первым появлением, когда они вошли в двадцатый раз в течение часа.