Mise à jour SQL pour enregistrer avec les données les plus proches
-
06-07-2019 - |
Question
Dans SQL Server 2008:
Supposons que j'ai deux tables.
La Table1 comporte 3 champs: Nom, Date1 et Date2. Actuellement, toutes les entrées Date2 sont NULL. (Nom, Date1) forme une clé unique.
La Table2 a 2 champs: Nom et Date2. (Nom, Date2) forme une clé unique.
Chaque " Nom " dans Table1 a au moins une entrée correspondante dans Table2.
À présent, je souhaite mettre à jour toutes les entrées Date2 de la Table1 (rappelez-vous qu'elles sont toutes NULL à l'heure actuelle) avec l'entrée Date2 de la Table2 qui est le le plus proche de Date1 dans la Table1. C'est à dire. la date qui donnerait le résultat de:
min(datediff(dd,Table1.Date1,Table2.Date2))
Pour être clair, si j’ai les entrées suivantes:
Tableau 1:
[Nom]: Karl, [Date1]: 1/1/2009, [Date2]: NULL
Tableau 2:
[Nom]: Karl, [Date2]: 1/1/2000
[Nom]: Karl, [Date2]: 1/7/2009
[Nom]: Karl, [Date2]: 1/1/2010
Ensuite, je souhaite mettre à jour Table1.Date2 avec "1/7/2009", car il s'agit de la date la plus proche de "1/1/2009".
Merci beaucoup
Karl
La solution
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)
Autres conseils
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
)
Vérifiez si vous avez besoin de ABS
. Je suppose que oui.
De plus, la requête ne gère pas le cas où il y a 2 dates dans la Table2 avec la même distance par rapport à la Date1, mais de côtés différents.