Какой процент времени пользователь входит в систему, сразу же после отправки сообщения? - PullRequest
1 голос
/ 04 апреля 2020

Я никогда раньше не спрашивал об этом и не уверен, насколько это возможно. Допустим, у меня есть следующая таблица:

user_id   date              event
22      2012-05-02 11:02:39 login
22      2012-05-02 11:02:53 send_message
22      2012-05-02 11:03:28 logout
22      2012-05-02 11:04:09 login
22      2012-05-02 11:03:16 send_message
22      2012-05-02 11:03:43 search_run

Как рассчитать процент времени, когда пользователь входит в систему и в течение 2 минут отправляет сообщение?

1 Ответ

1 голос
/ 05 апреля 2020

Для данного пользователя:

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 вводит в заблуждение.

...