#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?