Aggiornamento SQL per registrare con i dati più vicini
-
06-07-2019 - |
Domanda
In SQL Server 2008:
Supponiamo di avere due tabelle.
Tabella 1 ha 3 campi: Nome, Data1 e Data2. Attualmente, tutte le voci di Date2 sono NULL. (Nome, Data1) formano una chiave univoca.
Tabella 2 ha 2 campi: Nome e Data2. (Nome, Data2) formano una chiave univoca.
Ogni nome " " nella tabella 1 ha almeno una voce corrispondente nella tabella2.
Ora, voglio aggiornare tutte le voci Date2 in Table1 (ricordate che in questo momento sono tutte NULL) alla voce Date2 in Table2 che è il più vicino a Date1 in Table1. Cioè la data che darebbe il risultato di:
min(datediff(dd,Table1.Date1,Table2.Date2))
Quindi, per essere chiari, se ho le seguenti voci:
Tabella 1:
[Nome]: Karl, [Data1]: 1/1/2009, [Data2]: NULL
Tabella 2:
[Nome]: Karl, [Data2]: 1/1/2000
[Nome]: Karl, [Data2]: 1/7/2009
[Nome]: Karl, [Data2]: 1/1/2010
Quindi voglio aggiornare Table1.Date2 a '1/7/2009' poiché quella è la data più vicina a '1/1/2009'.
Grazie mille
Karl
Soluzione
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)
Altri suggerimenti
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
)
Controlla se hai bisogno di ABS
- credo di si.
Inoltre, la query non gestisce il caso in cui ci sono 2 date in Table2 con la stessa distanza dalla Data1, ma da lati diversi.