сравнение временных меток в двух последовательных строках, которые имеют разные значения для столбца A и одинаковое значение для столбца B в большом запросе - PullRequest
0 голосов
/ 01 апреля 2020

ребята, у меня есть большой результат запроса, который показывает мне время (в столбце local_time), когда райдеры (в столбце rider_id) выходят из приложения (столбец event), поэтому есть два отдельные значения для столбцов event, «authentication_complete» и «logout».

event_date  rider_id    event                    local_time
20200329    100695      authentication_complete  20:07:09
20200329    100884      authentication_complete  12:00:51
20200329    100967      logout                   10:53:17
20200329    100967      authentication_complete  10:55:24
20200329    100967      logout                   11:03:28
20200329    100967      authentication_complete  11:03:47
20200329    101252      authentication_complete  7:55:21
20200329    101940      authentication_complete  8:58:44
20200329    101940      authentication_complete  17:19:57
20200329    102015      authentication_complete  14:20:27
20200329    102015      logout                   22:47:50
20200329    102015      authentication_complete  22:48:34

что я хочу достичь, это для каждого гонщика, который когда-либо выходил из системы, в одном столбце я хочу получить время, которое они вышел из системы, и в другом столбце я хочу получить время для события «authentication_complete», которое наступает сразу после этого события выхода из системы для этого гонщика. Таким образом, я могу видеть период времени, когда каждый гонщик был вне приложения. результат запроса, который я хочу получить, будет выглядеть ниже.

event_date  rider_id    time_of_logout  authentication_complete_right_after_the_logout
20200329    100967      10:53:17        10:55:24
20200329    100967      11:03:28        11:03:47
20200329    102015      22:47:50        22:48:34

Это был очень нечистый набор данных, и до сих пор я был в состоянии очистить это много, но на этом этапе я чувствую себя очень застрявшим. Я искал такие функции, как lag(), но поскольку в данных содержится 180 000 строк, может быть несколько событий с именем «logout» для rider_id, и существует несколько последовательных событий с именем «authentication_complete» для одного и того же rider_id, это очень запутанно. Я был бы очень признателен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2020

Я думаю, что вы хотите lead():

select event_date, rider_id, date, local_time as logout_date,
       authentication_date
from (select t.*,
             lead(local_time) over (partition by event_date, rider_id order by local_time) as authentication_date
      from t
     ) t
where event = 'logout';

Это предполагает, что следующее событие действительно является аутентификацией, как в ваших примерах данных. Вы не указываете, что делать, если это не так.

Если вы хотите указать следующую дату аутентификации, вы можете использовать min():

select event_date, rider_id, date, local_time as logout_date,
       authentication_date
from (select t.*,
             min(case when event = 'authentication_complete' then local_time end) over (partition by event_date, rider_id order by local_time desc) as authentication_date
      from t
     ) t
where event = 'logout';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...