Principales respuestas
UNIR RANGO DE FECHAS

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-09SALUDOS
"SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"
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...
- Editado HunchbackMVP lunes, 13 de febrero de 2012 16:51
- Propuesto como respuesta Geovanny -Gio- Hernandez lunes, 13 de febrero de 2012 17:22
- Marcado como respuesta Eduardo PorteschellerModerator miércoles, 15 de febrero de 2012 11:02
- Desmarcado como respuesta ApreSabi jueves, 16 de febrero de 2012 22:52
- Votado como útil ApreSabi jueves, 16 de febrero de 2012 22:52
- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 19 de febrero de 2012 14:37