Looks like a gaps and islands problem.
DECLARE @t TABLE(PERSON CHAR(6), DT DATE, SHIFTTYPE VARCHAR(8))
INSERT INTO @t(PERSON, DT, SHIFTTYPE)
VALUES
('000001','20121001','WORKING'),
('000001','20121002','SICK'),
('000001','20121003','SICK'),
('000001','20121004','DAYOFF'),
('000001','20121005','SICK'),
('000001','20121006','WORKING'),
('000001','20121007','WORKING'),
('000001','20121008','SICK'),
('000001','20121009','SICK');
WITH CTE AS (
SELECT PERSON, DT, SHIFTTYPE,
ROW_NUMBER() OVER(PARTITION BY PERSON ORDER BY DT) AS rn1,
ROW_NUMBER() OVER(PARTITION BY PERSON, CASE WHEN SHIFTTYPE='WORKING' THEN 1 ELSE 0 END ORDER BY DT) AS rn2
FROM @t)
SELECT PERSON,
MIN(DT) AS FromDT,
MAX(DT) AS ToDT
FROM CTE
WHERE SHIFTTYPE<>'WORKING'
GROUP BY PERSON,rn1-rn2
ORDER BY PERSON,MIN(rn1);
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537