none
SQL -AGRUPAR FECHAS CONTINUAS EN UN SOLO RANGO RRS feed

  • Pregunta

  • Hola amigos espero puedan ayudarme, necesito crear una consulta que me agrupe fechas continuas en un solo rango.

    ejemplo

    Tengo la siguiente Tabla

    Operacion      Fecha_inicio            Fecha_Final           Horas

    Limitada        30.09.10 10:30       30.09.10  14:30       4

    Normal          01.10.10 00:00       02.10.10 00:00        24

    Normal          02.10.10 00:00       03.10.10 00:00        24

    Normal          03.10.10 00:00       04.10.10 00:00        24

     

    El resultado deberia ser :

    Limitada        30.09.10 10:30       30.09.10  14:30       4

    Normal       01.10.10 00:00       04.10:10 00:00           72  

     

    Esto me serviria para reducir el numero de registros que tengo

    Espero sus Respuestas o comentarios GRACIAS

     

     

    sábado, 30 de octubre de 2010 19:31

Respuestas

  • QUE TAL, ESTO DEBERIA DE FUNCIONAR

    SELECT 
    Operacion, MIN(Fecha_inicio) Fecha_inicio, MAX(Fecha_final) Fecha_final, SUM(Horas) Horas 
    FROM 
    TABLA
    GROUP BY 
    Operacion

    SALUDOS!

    Erik,

    Esta sugerencia no resuelve el este problema ya que agruparia aunque existan huecos en la secuencia.

    Si desean aprender de un metodo efectivo para resolver este tipo de problema, les recomiendo leer esta solucion de Itzik Ben-Gan (se requiere SS 2012 o posterior).

    New Solution to the Packing Intervals Problem
    http://sqlmag.com/sql-server/new-solution-packing-intervals-problem


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    miércoles, 11 de enero de 2017 14:50
  • Con los nuevos datos de ejemplo habría que cambiar un poco la instrución:

     ;WITH a AS (
     SELECT * , 
      ISNULL(( 
       SELECT MAX(fecha_final) ffin 
       FROM @fechas f2 
       WHERE f1.Operacion = f2.Operacion AND 
        DATEDIFF(hh, f1.fecha_inicio, f2.Fecha_Final) =
        DATEDIFF(d, f1.fecha_inicio, f2.Fecha_Final) * 24 ) ,  f1.Fecha_Final ) as ffin 
     FROM @fechas f1 ) 
    SELECT a.operacion, MIN(Fecha_inicio) AS fecha_Inicio, MAX(case when ffin < Fecha_Final then Fecha_Final else ffin end) AS fecha_final , DATEDIFF(hh, MIN(Fecha_inicio), MAX(case when ffin < Fecha_Final then Fecha_Final else ffin end)) AS horas 
    FROM a 
    GROUP BY a.Operacion, case when ffin < Fecha_Final then Fecha_Final else ffin end

     

    Lo de la función no termino de entenderlo bien. Y en cuanto a usar CONNECT BY, creo que eso es de Oracle, no de SQL Server.

    martes, 2 de noviembre de 2010 15:43

Todas las respuestas

  • El problema es que solo tiene que agrupar fechas continuas,si existiera otra pero discontinua debe tomarse como otro evento, solo debe agrupar eventos continuos.Y la columna horas esta calculado como fecha_final-fecha_inicio,no esta como una columna definida. La columna operacion esta enlazado a otra tabla que tiene el codigo de operacion.  digamos 1=Normal,2=Limitada.

    Tengo la siguiente Tabla

    Operacion      Fecha_inicio            Fecha_Final           Horas

    Limitada        30.09.10 10:30       30.09.10  14:30       4

    Normal          01.10.10 00:00       02.10.10 00:00        24

    Normal          02.10.10 00:00       03.10.10 00:00        24

    Normal          03.10.10 00:00       04.10.10 00:00        24

    Normal          05.10.10 10:00       05.10.10 11:00        1

    Limitada        05.10.10 11:30       05.10.10 15:30        4

     .

    El resultado deberia ser :

    Limitada        30.09.10 10:30       30.09.10  14:30       4

    Normal         01.10.10 00:00       04.10:10 00:00        72  

    Normal          5.10.10 10:00       05.10.10 11:00         1

    Limitada        05.10.10 11:30       05.10.10 15:30        4

    Estos datos corresponden a un equipo, asi que cuando se realice la consulta yo debere dar el codigo del equipo y debera desplegarme este resultado como resumen de su operacion.Soy nuevo en esto y agradezco sus respuesta o cualquier comentario.

    GRACIAS

    lunes, 1 de noviembre de 2010 21:37
  • Una solución (que no la más óptima) podría ser la siguiente: DECLARE @fechas AS TABLE (Operacion VARCHAR(100), Fecha_inicio DATETIME , Fecha_Final DATETIME ) INSERT @fechas VALUES ('Limitada','20100930 10:30','20100930 14:30'), ('Normal','20101001 00:00','20101002 00:00'), ('Normal','20101002 00:00','20101003 00:00'), ('Normal','20101003 00:00','20101004 00:00'), ('Normal','20101005 10:00','20101005 11:00'), ('Limitada','20101005 11:30','20101005 15:30') ;WITH a AS ( SELECT * , ISNULL( ( SELECT MAX(fecha_final) ffin FROM @fechas f2 WHERE f1.Operacion = f2.Operacion AND DATEDIFF(hh, f1.fecha_inicio, f2.Fecha_Final) = DATEDIFF(d, f1.fecha_inicio, f2.Fecha_Final) * 24 ) , f1.Fecha_Final ) ffin FROM @fechas f1 ) SELECT a.operacion, MIN(Fecha_inicio) AS fecha_Inicio, MAX(ffin) AS fecha_final , DATEDIFF(hh, MIN(Fecha_inicio), MAX(Fecha_final)) AS horas FROM a GROUP BY a.Operacion, ffin
    • Editado Carlos Sacristan martes, 2 de noviembre de 2010 13:43 intentando formatear el codigo
    • Propuesto como respuesta Carlos Sacristan martes, 2 de noviembre de 2010 13:44
    martes, 2 de noviembre de 2010 13:42
  • El script es a modo de ejemplo, por eso uso los datos que proporcionados en la pregunta sobre variables. El nombre de la tabla y sus columnas las debería sustituir JC_Numb por su tabla
    martes, 2 de noviembre de 2010 15:18
  • Gracias por las respuestas lo voy a probar,pero tengo el problema de que  mi tabla de donde extraigo estos datos que corresponden a cierta unidad tiene miles de filas, se tiene registros desde el 2009 o menos creo y se actualiza cada dia.

    Soy bastante nuevo en esto,y algunos me aconsejaron realizar una funcion que reciba la fecha inicial(hora inicial) y recorra talvez mientras la diferencia entre final-inicial sea 1 o 24 en todo caso , Por que solo debe agrupar eventos que sean continuos y los discontinuos dejarlos como eventos independientes,y la funcion me devuelva la fecha final(hora final).pero podria existir el caso en que siga siendo continuo pero la diferencia sea 12 o menos como el sgte ejm. 

    Normal          02.10.10 00:00       03.10.10 00:00        24

    Normal          03.10.10 00:00       04.10.10 00:00        24

    Normal          04.10.10 00:00       04.10.10 12:00        12

    Limitada        05.10.10 11:30       05.10.10 15:30        4

    Tambien me dijeron que talvez pueda usar CONNECT BY ,lo he intentado aunque talves no con la logica correcta.

    Gracias por su ayuda y voy a seguir probando,espero todos sus comentarios.

     

     

    martes, 2 de noviembre de 2010 15:25
  • Con los nuevos datos de ejemplo habría que cambiar un poco la instrución:

     ;WITH a AS (
     SELECT * , 
      ISNULL(( 
       SELECT MAX(fecha_final) ffin 
       FROM @fechas f2 
       WHERE f1.Operacion = f2.Operacion AND 
        DATEDIFF(hh, f1.fecha_inicio, f2.Fecha_Final) =
        DATEDIFF(d, f1.fecha_inicio, f2.Fecha_Final) * 24 ) ,  f1.Fecha_Final ) as ffin 
     FROM @fechas f1 ) 
    SELECT a.operacion, MIN(Fecha_inicio) AS fecha_Inicio, MAX(case when ffin < Fecha_Final then Fecha_Final else ffin end) AS fecha_final , DATEDIFF(hh, MIN(Fecha_inicio), MAX(case when ffin < Fecha_Final then Fecha_Final else ffin end)) AS horas 
    FROM a 
    GROUP BY a.Operacion, case when ffin < Fecha_Final then Fecha_Final else ffin end

     

    Lo de la función no termino de entenderlo bien. Y en cuanto a usar CONNECT BY, creo que eso es de Oracle, no de SQL Server.

    martes, 2 de noviembre de 2010 15:43
  • Gracias lo voy a probar y les comento como me fue.

    martes, 2 de noviembre de 2010 15:49
  • "CONNECT BY"?

    Esa clausula no existe en T-SQL, me parece haber leido que es parte the PL/SQL, el lenguaje de Oracle.

    Yo te sugiero que postees la estructura de la tabla, y data de ejemplo significativa, ademas del resultado esperado. De esa forma nos ahorramos el "dime que te dire" por hacer suposiciones no planteadas en el hilo original.

     


    AMB

    Some guidelines for posting questions...

    martes, 2 de noviembre de 2010 17:04
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    domingo, 7 de noviembre de 2010 15:04
    Moderador
  • QUE TAL, ESTO DEBERIA DE FUNCIONAR

    SELECT 
    Operacion, MIN(Fecha_inicio) Fecha_inicio, MAX(Fecha_final) Fecha_final, SUM(Horas) Horas 
    FROM 
    TABLA
    GROUP BY 
    Operacion

    SALUDOS!

    martes, 10 de enero de 2017 20:26
  • QUE TAL, ESTO DEBERIA DE FUNCIONAR

    SELECT 
    Operacion, MIN(Fecha_inicio) Fecha_inicio, MAX(Fecha_final) Fecha_final, SUM(Horas) Horas 
    FROM 
    TABLA
    GROUP BY 
    Operacion

    SALUDOS!

    Erik,

    Esta sugerencia no resuelve el este problema ya que agruparia aunque existan huecos en la secuencia.

    Si desean aprender de un metodo efectivo para resolver este tipo de problema, les recomiendo leer esta solucion de Itzik Ben-Gan (se requiere SS 2012 o posterior).

    New Solution to the Packing Intervals Problem
    http://sqlmag.com/sql-server/new-solution-packing-intervals-problem


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    miércoles, 11 de enero de 2017 14:50