De hecho- mi respuesta no es correcta..
Voy a agregar unas filas mas (02-01-2013 14:30 - 02-01-2013 15:40):
Código SQL:
Ver originalINSERT INTO #T SELECT 1,'02-01-2013 14:00','inicio';
INSERT INTO #T SELECT 1,'02-01-2013 14:30','inicio';
INSERT INTO #T SELECT 1,'02-01-2013 14:40','inicio';
INSERT INTO #T SELECT 1,'02-01-2013 14:50','inicio';
INSERT INTO #T SELECT 1,'02-01-2013 15:30','fin';
INSERT INTO #T SELECT 1,'02-01-2013 15:33','fin';
INSERT INTO #T SELECT 1,'02-01-2013 15:35','fin';
INSERT INTO #T SELECT 1,'02-01-2013 15:40','fin';
y la correcta recuperacion es:
Código SQL:
Ver originalWITH T1 AS
(SELECT ROW_NUMBER() OVER(ORDER BY Fecha)-ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
*
FROM #T),
T2 AS
(SELECT N, --Case Estado When 'inicio' Then N+1 Else N End N,
Estado,
CASE Estado WHEN 'inicio' THEN MIN(Fecha) ELSE MAX(Fecha) END Fecha
FROM T1
GROUP BY N,
Estado),
T3 AS
(SELECT ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
Estado,
Fecha
FROM T2 )
SELECT MIN(Fecha) inicio,
MAX(Fecha) Fin
FROM T3
GROUP BY N
ORDER BY N;
Libras- no debes corregir nada, tu codigo es correcto tambien con este caso extremo.