Для данного пользователя:
SELECT round(count(*) FILTER (WHERE sent_in_time) * 100.0 / count(*), 2) AS pct_sent_in_time
FROM (
SELECT (min(date) FILTER (WHERE event = 'send_message')
- min(date)) < interval '2 min' AS sent_in_time
FROM (
SELECT date, event
, count(*) FILTER (WHERE event = 'login')
OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS grp
FROM tbl
WHERE user_id = 22 -- given user
) sub1
GROUP BY grp
) sub2;
| pct_sent_in_time |
| ---------------: |
| 50.00 |
Для всех пользователей:
SELECT user_id
, round(count(*) FILTER (WHERE sent_in_time) * 100.0 / count(*), 2) AS pct_sent_in_time
FROM (
SELECT user_id
, (min(date) FILTER (WHERE event = 'send_message')
- min(date)) < interval '2 min' AS sent_in_time
FROM (
SELECT user_id, date, event
, count(*) FILTER (WHERE event = 'login')
OVER (PARTITION BY user_id ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS grp
FROM tbl
) sub1
GROUP BY user_id, grp
) sub2
GROUP BY user_id;
user_id | pct_sent_in_time
------: | ---------------:
22 | 33.33
23 | 100.00
Я расширил тестовый пример, чтобы сделать его более наглядным, а значит, иным процент. См .:
db <> fiddle здесь
Разделите данные после каждого нового входа в систему и проверьте, происходит ли 'send_message' в течение менее 2 минут. Затем вычислите процент и округление.
Примечательно, что многие логины не обманывают это в быстрой последовательности, после моего входа в систему с сообщением менее чем за 2 минуты.
Похожие:
В стороне: название «дата» для столбца timestamp вводит в заблуждение.