SQL Время между двумя событиями - PullRequest
0 голосов
/ 20 июня 2020

Я хочу расширить решение из: Время между двумя событиями

Учитывая следующую таблицу, я хочу иметь возможность найти разницу во времени при изменении действия с clear на create. Как видите, элемент может clear несколько раз перед create.

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

 id | user_id | action |         created_at         
----+---------+--------+----------------------------
  5 |       1 | clear  | 2016-09-08 11:29:56
  6 |       1 | create | 2016-09-08 11:30:00
  7 |       2 | create | 2016-09-08 11:30:10
  8 |       2 | clear  | 2016-09-08 11:30:14
  9 |       2 | clear  | 2016-09-08 11:30:42
  10|       2 | create | 2016-09-08 11:30:43
  11|       2 | clear  | 2016-09-08 11:30:47
  12|       2 | create | 2016-09-08 11:30:55

Желаемый результат (изменения между id 5-6, id 9-10, id 11-12):

 user_id |    time_diff    
---------+-----------------
       1 | 00:00:03
       2 | 00:00:01
       2 | 00:00:08

Используя следующий код, я могу извлечь только самая последняя разница времени, а не все из них:

SELECT user_id,
       MAX(CASE WHEN action = 'create' THEN created_at END) -
       MAX(CASE WHEN action = 'clear' THEN created_at END) AS time_diff 
FROM mytable
GROUP BY user_id 
HAVING COUNT(*) >= 2

1 Ответ

0 голосов
/ 20 июня 2020

You lead():

select user_id, (next_created_at - created_at)
from (select t.*,
              lead(action) over (partition by user_id order by created_at) as next_action,
              lead(created_at) over (partition by user_id order by created_at) as next_created_at
      from t
     ) t
where next_action = 'clear' and action = 'create';

Здесь - это SQL скрипка.

В более старых версиях MySQL вы можете использовать коррелированные подзапросы чтобы получить следующее значение:

select user_id, (next_created_at - created_at)
from (select t.*,
             (select t2.action
              from t t2
              where t2.user_id = t.user_id and
                    t2.created_at > t.created_at
              order by t2.created_at
              limit 1
             ) as next_action,
             (select t2.created_at
              from t t2
              where t2.user_id = t.user_id and
                    t2.created_at > t.created_at
              order by t2.created_at
              limit 1
             ) as next_created_at
      from t
     ) t
where next_action = 'clear' and action = 'create';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...