Ver Mensaje Individual
  #13 (permalink)  
Antiguo 23/10/2013, 01:05
GeriReshef
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta SQL resta de 2 fechas en el mismo campo en distinto registro. (co

Se pone más y más complicado..
Supongo que en tal casos debemos omitir los 'fin' en el principio y los 'inicio' en el fin.
Te adjunto toda la solución con todos los datos:
Código SQL:
Ver original
  1. IF Object_ID('tempdb..#T','U') IS NOT NULL DROP TABLE #T;
  2.  
  3. CREATE TABLE #T(id INT,
  4.                 Fecha DateTime,
  5.                 Estado VARCHAR(10));
  6.  
  7. INSERT INTO #T SELECT 1,'01-01-2013 01:00','fin';
  8. INSERT INTO #T SELECT 1,'01-01-2013 02:00','fin';
  9. INSERT INTO #T SELECT 1,'01-01-2013 03:00','fin';
  10.  
  11. INSERT INTO #T SELECT 1,'01-01-2013 08:00','inicio';
  12. INSERT INTO #T SELECT 1,'01-01-2013 10:00','fin';
  13. INSERT INTO #T SELECT 1,'01-01-2013 13:00','inicio';
  14. INSERT INTO #T SELECT 1,'01-01-2013 13:30','fin';
  15. INSERT INTO #T SELECT 1,'01-01-2013 13:40','fin';
  16. INSERT INTO #T SELECT 1,'01-01-2013 14:00','inicio';
  17. INSERT INTO #T SELECT 1,'01-01-2013 14:30','inicio';
  18. INSERT INTO #T SELECT 1,'01-01-2013 15:40','fin';
  19.  
  20. INSERT INTO #T SELECT 1,'02-01-2013 14:00','inicio';
  21. INSERT INTO #T SELECT 1,'02-01-2013 14:30','inicio';
  22. INSERT INTO #T SELECT 1,'02-01-2013 14:40','inicio';
  23. INSERT INTO #T SELECT 1,'02-01-2013 14:50','inicio';
  24. INSERT INTO #T SELECT 1,'02-01-2013 15:30','fin';
  25. INSERT INTO #T SELECT 1,'02-01-2013 15:33','fin';
  26. INSERT INTO #T SELECT 1,'02-01-2013 15:35','fin';
  27. INSERT INTO #T SELECT 1,'02-01-2013 15:40','fin';
  28.  
  29.  
  30. INSERT INTO #T SELECT 1,'02-01-2013 23:00','inicio';
  31. INSERT INTO #T SELECT 1,'02-01-2013 23:10','inicio';
  32. INSERT INTO #T SELECT 1,'02-01-2013 23:20','inicio';
  33.  
  34. WITH T1 AS
  35. (SELECT ROW_NUMBER() OVER(ORDER BY Fecha)-ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  36.         *
  37. FROM    #T),
  38. T2 AS
  39. (SELECT N,
  40.         Estado,
  41.         CASE Estado WHEN 'inicio' THEN MIN(Fecha) ELSE MAX(Fecha) END Fecha,
  42.         MIN(N) OVER() MinN,
  43.         MAX(N) OVER() MaxN
  44. FROM    T1
  45. GROUP BY N,
  46.         Estado),
  47. T3 AS
  48. (SELECT ROW_NUMBER() OVER(Partition BY Estado ORDER BY Fecha) N,
  49.         Estado,
  50.         Fecha
  51. FROM    T2
  52. WHERE   NOT (N=MinN AND Estado='fin')
  53.         AND NOT (N=MaxN AND Estado='inicio'))
  54. SELECT  MIN(Fecha) inicio,
  55.         MAX(Fecha) Fin
  56. FROM    T3
  57. GROUP BY N
  58. ORDER BY N;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog