Как эффективно отмечать последовательные сдвиги в SQL

#sql

#sql

Вопрос:

У меня есть набор данных, который содержит 250 000 строк и, как ожидается, будет расти примерно на 100 000 строк в месяц.

У меня есть данные, которые содержат следующие столбцы:

ShiftDate (День, в который произошел сдвиг),

Время начала сдвига,

Время окончания смены

и номер сотрудника.

Я хотел бы отмечать последовательные смены с помощью 1, когда время окончания смены сотрудников было в пределах 4 часов от времени начала их следующей смены, в противном случае отмечайте его с помощью 0.
моя таблица данных

Я пытался запустить запрос, который соединяет таблицу с самим собой, но время выполнения слишком велико. Я планировал создать флаг на основе инструкции case, используя ‘NextSTART’:

 select shiftdate,
shiftstarttime,
shiftendtime,
EmployeeID,
 (select min(t2.shiftstarttime) from TABLE t2 where t1.EmployeeID=t2.EmployeeID and T2.shiftstarttime > t1.Shiftendtime) as NextStart 
 from 
  TABLE t1
  

Я хотел бы знать более эффективный способ попытаться сделать это.

Спасибо!

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

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

 Select shiftdate, shiftstarttime, shiftendtime, employeeid,
(Case when  
lead(shiftstarttime, 1) over (partition by employeeid order by shiftdate, shiftstarttime) -  shiftendtime < 4 then 1 else 0 end) as consecutive_shift_flag 
from table_name
  

В этом окне функция запроса lead() используется для получения времени начала следующей смены для этого сотрудника

 lead(shiftstarttime, 1) over (partition by employeeid order by shiftdate, shiftstarttime) 
  

В случае, если это не то, что вы ищете, пожалуйста, поделитесь примером правильного вывода на основе входных данных для пары случаев.