1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| ;with cte AS (
select *
from (
values ('Dupond', 'Electricien', '2001-01-01', '2001-12-31')
, ('Dupond', 'Electricien', '2002-01-01', '2002-12-31')
, ('Dupond', 'Electricien', '2003-01-01', '2003-12-31')
, ('Dupond', 'Plombier' , '2004-01-01', '2004-12-31')
, ('Dupond', 'Plombier' , '2005-01-01', '2005-12-31')
, ('Dupond', 'Plombier' , '2006-01-01', '2006-12-31')
, ('Dupond', 'Maçon' , '2007-01-01', '2007-12-31')
, ('Dupond', 'Maçon' , '2008-01-01', '2008-12-31')
, ('Dupond', 'Electricien', '2009-01-01', '2009-12-31')
, ('Dupond', 'Electricien', '2010-01-01', '2010-12-31')
, ('Dupond', 'Electricien', '2011-01-01', NULL)
) AS td(Person, JobTitle, dateFrom, dateTo)
),
cte2 as (
select
*,
coalesce(lag(dateTo) over (partition by Person, JobTitle order by dateFrom), dateadd(day, -1, dateFrom)) as PreviousDateTo,
row_number() over (partition by Person, JobTitle order by datefrom) as Rn
from cte
),
cte3 as (
SELECT *,
sum(datediff(day, PreviousDateTo, dateFrom)) over (
partition by Person, JobTitle
order by Rn
rows between unbounded preceding and current row
) as GapRn
FROM cte2
)
SELECT Person, JobTitle,
min(DateFrom) as dateFrom,
nullif(Max(COALESCE(DateTo, '9999-12-31')), '9999-12-31') as dateTo
FROM cte3
GROUP BY Person, JobTitle, GapRn - Rn
ORDER BY dateFrom |
Partager