Как выбрать следующую дату и время для того же идентификатора агента в SQL

#mysql #sql #datetime #subquery #window-functions

#mysql #sql #дата и время #подзапрос #окно-функции

Вопрос:

Первый столбец (CALL_START) — это время, в течение которого кто-то с определенным идентификатором (CALLER_ID) совершил вызов. смотрите Фрагмент данных здесь.

Теперь я хочу выбрать следующий вызов с тем же идентификатором и сохранить его в новом столбце с именем ‘Next_call’, и если следующего вызова нет, он сохраняет значение NULL.

Итак, это результат, который я хочу видеть ниже.

 CALL_START             NEXT_CALL             CALLER_ID
2017-01-14 10:50:38   NULL                  2837061
2017-01-14 10:21:03   2017-01-14 10:50:38   2837061
  

Идентификатор ВЫЗЫВАЮЩЕГО абонента должен быть таким же, чтобы найти следующий вызов, поэтому я должен найти следующий вызов в соответствии с каждым идентификатором.

Я пробовал это до сих пор.

 select CALL_START, CALLER_ID
from call_data.records
where CALL_START > (select CALL_START from call_data.records group by CALLER_ID)
;
  

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

Я новичок в изучении SQL, поэтому буду признателен за любую помощь.

Ответ №1:

Если вы используете MySQL 8.0, вы можете использовать lead()| :

 select 
    call_start, 
    lead(call_start) over(partition by caller_id order by call_start) next_call, 
    caller_id
from call_data.records r
  

В более ранних версиях одной из альтернатив является подзапрос:

 select
    call_start,
    (
        select min(r1.call_start) 
        from call_data.records r1 
        where r1.caller_id = r.caller_id and r1.call_start > r.call_start
    )  next_call,
    caller_id
from call_data.records r
  

Комментарии:

1. Первый запрос выдает мне столбец next_call, но caller_id показывает null во всех строках

2. Пожалуйста, скажите мне, почему во втором запросе есть 2 оператора from? Это показывает мне синтаксическую ошибку.

3. @Chloe: это была опечатка. Исправлено

4. Я не думаю, что это может сработать, поскольку records — это временная таблица. Я упоминал выше. Можете ли вы подсказать мне альтернативный способ LEAD() с использованием rownumber?