Подсчет последовательных смен и дней в 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;

Это по крайней мере возвращает данные, которые у вас есть в вашем вопросе.

Другие вопросы по тегам