Actualización de SQL para grabar con datos más cercanos
-
06-07-2019 - |
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
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.