Это пример проблемы разрывов и островков. Решением здесь является определение «островков» по их запускам, поэтому процесс выглядит так:
- определить, когда начинается новая группировка (то есть, нет совпадения с предыдущей строкой)
- сделать кумулятивную сумму начальных значений для получения значения группировки
- Совокупный
Это похоже на
select max(id), EmployeeCode, JobNumber,
min(fromdate), max(todate)
from (select t.*,
sum(case when fromdate = dateadd(day, 1, prev_todate) then 0 else 1 end) over
(partition by EmployeeCode, JobNumber order by id
) as grouping
from (select t.*,
lag(todate) over (partition by EmployeeCode, JobNumber order by id) as prev_todate
from t
) t
) t
group by grouping, EmployeeCode, JobNumber;
Неясно, для чего нужна логика TransferNo
. Самое простое решение - просто min()
или max()
, но это не вернет NULL
.