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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top