Pregunta

En SQL Server 2008:

Supongamos que tengo dos tablas.

Tabla1 tiene 3 campos: Nombre, Fecha1 y Fecha2. Actualmente, todas las entradas de Date2 son NULL. (Nombre, Fecha1) forman una clave única.

Table2 tiene 2 campos: Nombre y Fecha2. (Nombre, Fecha2) forman una clave única.

Cada " Nombre " en la Tabla1 tiene al menos una entrada correspondiente en la Tabla2.

Ahora, quiero actualizar todas las entradas de Date2 en Table1 (recuerde que todas son NULL en este momento) a la entrada de Date2 en Table2 que es la más cercana a Date1 en Table1. Es decir. la fecha que daría el resultado de:

 min(datediff(dd,Table1.Date1,Table2.Date2))

Para que quede claro, si tengo las siguientes entradas:

Tabla1:

[Nombre]: Karl, [Fecha1]: 1/1/2009, [Fecha2]: NULL

Tabla2:

[Nombre]: Karl, [Fecha2]: 1/1/2000

[Nombre]: Karl, [Fecha2]: 1/7/2009

[Nombre]: Karl, [Fecha2]: 1/1/2010

Entonces quiero actualizar Table1.Date2 a '1/7/2009' ya que esa es la fecha más cercana a '1/1/2009'.

Muchas gracias

Karl

¿Fue útil?

Solución

WITH abcd AS
 (
 SELECT t1.Name,t1.Date1, t2.Date2
  ,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
 FROM 
  Table1 AS t1 
  JOIN Table2 AS t2 ON t1.Name = t2.Name
 )
UPDATE Table1 SET
    [Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)

Otros consejos

UPDATE  Table1
SET     Date2 = t2.Date2
FROM    Table1 t1
JOIN    Table2 t2
    ON  t1.Name = t2.Name
    AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT  MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
                                                FROM    Table1 t1
                                                JOIN    Table2 t2
                                                    ON  t1.Name = t2.Name
                                                )

Verifique si necesita ABS - Supongo que sí.

Además, la consulta no maneja el caso donde hay 2 fechas en la Tabla2 con la misma distancia a la Fecha1, pero desde diferentes lados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top