none
UNIR RANGO DE FECHAS RRS feed

  • Pregunta

  •    HOLA QUE TAL :  QUIERO UNIR RANGO DE FECHAS 

    TABLA HOR

    ID_HOR/ID_PRO
    1                         1 
    2                         1

    TABLA  MI_TABLA  (LOS REGISTROS PERTENCEN A UN SOLO ID_PRO)
       ID/         ID_DOC       /     FECHA        /      ID_ HOR     
         1                  D1                    2012-02-02                 1
         2                   D1                    2012-02-03                 2
         3                   D2                    2012-02- 04                 2
         4                   D2                     2012-02-05                 2
         5                   D1                    2012-02-06                  2
         6                   D1                    2012-02-07                   1
         7                   D3                    2012-02-08                   1
         8                   D3                    2012-02-09                   1


    SELECT   MI_TABLA.ID_DOC,MINIMA=MIN(FECHA),MAXIMA=(FECHA) FROM MI_TABLA
    INNER JOIN  DOC ON MI_TABLA.ID_DOC=DOC.ID_DOC
    INNER JOIN HOR ON MI_TABLA.ID_HOR =HOR.ID_HOR 
    WHERE HOR.ID_PRO=1
    GROUP BY   MI_TABLA.ID_DOC
    -- ESTA CONSULTA ME DA COMO RESULTADO 
            ID_DOC       /     MINIMA       /      MAXIMA    
                      D1                    2012-02-02                2012-02-07   
                      D2                    2012-02- 04               2012-02-05 
                      D3                    2012-02-08                 2012-02-09

    PERO EL RESULTADO QUE YO ESPERO ES :(QUIERO RESPETAR LOS RANGOS SI HAY UNA RANGO INTERMEDIARIO)
             ID_DOC       /     MINIMA        /      MAXIMA   
                      D1                    2012-02-02               2012-02-03 
                     D2                    2012-02- 04             2012-02-05 
                    D1                    2012-02-06              2012-02-07    
                    D3                    2012-02-08              2012-02-09     

    SALUDOS




    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    lunes, 13 de febrero de 2012 13:57

Respuestas

  • La proxima vez que postees una pregunta como esta, ten en cuenta lo util de adjuntar el esquema de las tablas, data de ejemplo en forma de sentencias "insert", asi como el resultado esperado. De esa manera no tenemos que mal gastar nuestro tiempo recreando tu ambiente, y solo seria copiar y pegar para nosotros poder reproducirlo. Ademas, no tendremos que adivinar nombre de columnas, tipos de datos, existencia de restricciones y/o indices.

    Dicho lo anterior, este problema se conoce como "encontrar islas" (filas consecutivas), y una manera de resolverlo es usando funciones de rango (ranking functions) para encontrar un identificador de los grupos. Una vez encontrado el identificador, el resto es agrupar y agregar.

    SET NOCOUNT ON;
    USE tempdb;
    GO
    DECLARE @T TABLE (
    ID int NOT NULL,
    ID_DOC varchar(10) NOT NULL,
    FECHA date NOT NULL,
    ID_HOR int NOT NULL
    );
    
    INSERT INTO @T (ID, ID_DOC, FECHA, ID_HOR)
    VALUES
    (1, 'D1', '20120202', 1),
    (2, 'D1', '20120203', 2),
    (3, 'D2', '20120204', 2),
    (4, 'D2', '20120205', 2),
    (5, 'D1', '20120206', 2),
    (6, 'D1', '20120207', 1),
    (7, 'D3', '20120208', 1),
    (8, 'D3', '20120209', 1);
    
    WITH R AS (
    SELECT
        ID_DOC,
        FECHA,
        DATEADD([day], -1 * ROW_NUMBER() OVER(PARTITION BY ID_DOC ORDER BY FECHA), FECHA) AS grp 
    FROM
    	@T
    )
    SELECT
    	ID_DOC,
    	MIN(FECHA) AS minima,
    	MAX(FECHA) AS maxima
    FROM
    	R
    GROUP BY
    	ID_DOC, grp
    ORDER BY
    	minima;
    GO
    
    /*
    
    ID_DOC	minima	maxima
    D1	2012-02-02	2012-02-03
    D2	2012-02-04	2012-02-05
    D1	2012-02-06	2012-02-07
    D3	2012-02-08	2012-02-09
    
    */

    Puedes leer mas sobre este tipo de problemas, en el ultimo libro de Itzik Ben-Gan sobre T-SQL Querying.

    Inside Microsoft® SQL Server® 2008: T-SQL Querying
    http://www.amazon.com/gp/product/0735626030/ref=pd_lpo_k2_dp_sr_2?pf_rd_p=486539851&pf_rd_s=lpo-top-stripe-1&pf_rd_t=201&pf_rd_i=0735626014&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=1MX8YFB81R05VZ9EW64P


    AMB

    Some guidelines for posting questions...


    lunes, 13 de febrero de 2012 16:47