#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)
В случае, если это не то, что вы ищете, пожалуйста, поделитесь примером правильного вывода на основе входных данных для пары случаев.