Подсчет последовательных смен и дней в SQL
Я пытаюсь отобразить количество последовательных смен и дней, в которых работала команда. Я попробовал несколько решений, но просто не могу понять это совершенно правильно.
Данные - Дата, Сдвиг, Экипаж. Есть дневная и ночная смены и 3 экипажа. ConsecutiveShift и ConsecutiveDay - это поля, которые я пытаюсь создать. Выходные данные будут использоваться для оценки производительности на основе количества последовательных смен / отработанных дней.
Любая помощь очень ценится
Dateop Shift Crew
2015-12-23 00:00:00 D B Crew
2015-12-23 00:00:00 N A Crew
2015-12-24 00:00:00 D B Crew
2015-12-24 00:00:00 N A Crew
2015-12-25 00:00:00 D C Crew
2015-12-25 00:00:00 N B Crew
2015-12-26 00:00:00 D C Crew
2015-12-26 00:00:00 N B Crew
2015-12-27 00:00:00 D C Crew
2015-12-27 00:00:00 N B Crew
2015-12-28 00:00:00 D C Crew
2015-12-28 00:00:00 N B Crew
2015-12-29 00:00:00 D C Crew
2015-12-29 00:00:00 N B Crew
2015-12-30 00:00:00 D A Crew
2015-12-30 00:00:00 N C Crew
2015-12-31 00:00:00 D A Crew
2015-12-31 00:00:00 N C Crew
2016-01-01 00:00:00 D A Crew
2016-01-01 00:00:00 N C Crew
2016-01-02 00:00:00 D A Crew
2016-01-02 00:00:00 N C Crew
Желаемый результат - первые 3 столбца - это исходные данные, столбцы 4 и 5 - это счетчики, которые я пытаюсь получить
2 ответа
Следующий запрос должен работать, используя оконные функции:
With cte As (
Select DateOp, Shift, Crew,
DateDiff(Day, DateOp, '2016-01-01') + Row_Number() Over (Partition By Crew, Shift Order By DateOp) As ShiftIsland,
DateDiff(Day, DateOp, '2016-01-01') + Row_Number() Over (Partition By Crew Order By DateOp) As DayIsland
From [YourTable])
Select DateOp, Shift, Crew,
Row_Number() Over (Partition By Crew, Shift, ShiftIsland Order By DateOp) As ConsecutiveShifts,
Row_Number() Over (Partition By Crew, DayIsland Order By DateOp) As ConsecutiveDays
From cte
Order By Crew, DateOp, Shift;
Я думаю, что это основной row_number()
, Для данных, которые вы предоставили:
select t.*,
row_number() over (partition by shift, crew order by date) as consecutiveshift,
row_number() over (partition by crew order by date) as consecutiveday
from t;
Это по крайней мере возвращает данные, которые у вас есть в вашем вопросе.