Подсчитать количество событий между двумя (или более) разными периодами входа - PullRequest
1 голос
/ 15 марта 2020

Я хотел бы посчитать количество событий, произошедших для каждого пользователя между каждым логином. Логин хранится в одной таблице, а другие события хранятся в другой.

Так что, если пользователь вошел в систему с 2019-10-03 10:00:00, то любые события, произошедшие после этого времени, будут сгруппированы и засчитаны в соответствии с этим параметром. c время до появления нового события (например: 2019-11-04 11:00:00), и затем мы будем считать в соответствии с новым временем.

Это означает, что для 2019-10-03 10:00:00 мы будем считать все значения между 2019-10-03 10:00:00 и 2019-11-04 11:00:00 и для 2019-11-04 11:00:00 мы считаем что-нибудь выше него.

Другой способ взглянуть на это:

user_login:

User | Login_Timestamp
1    | 2019-10-03 10:00:00
1    | 2019-11-03 14:44:00
1    | 2019-14-03 08:01:11

user_events:

User | ... | EventTimestamp
1    | ... | 2019-10-03 10:01:00
1    | ... | 2019-10-03 10:10:00
1    | ... | 2019-11-03 13:10:00
1    | ... | 2019-11-03 14:45:11
1    | ... | 2019-11-03 14:46:11
1    | ... | 2019-14-03 10:10:00

Я хотел бы получить вывод:

User | LoginTimestamp       | NumberOfEvents
1    | 2019-10-03 10:00:00  | 3
1    | 2019-11-03 14:44:00  | 2
1    | 2019-14-03 08:01:11  | 1

Спасибо!

1 Ответ

1 голос
/ 15 марта 2020

Использование транспонирования:

WITH cte AS (
  SELECT user, 
      loginTimestamp AS loginTimestampStart, 
      LEAD(loginTimestampStart) OVER(PARTITION BY user
                                     ORDER BY loginTimestamp) AS loginTimestampEnd
  FROM user_login
)
SELECT c.user, c.loginTimestampStart, COUNT(*) AS NumberOfEvents
FROM cte c
JOIN user_events e
  ON c.user = e.user
 AND e.EventTimestamp >= c.loginTimestampStart
 AND (e.EventTimestamp < c.loginTimestampEnd OR c.loginTimestampEnd IS NULL)
GROUP BY c.user, c.loginTimestampStart
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...