SQL-Update mit nächsten Daten aufzuzeichnen
-
06-07-2019 - |
Frage
In SQL Server 2008:
Angenommen, ich habe zwei Tabellen.
Tabelle 1 hat drei Felder: Name, Date1 und Date2. Derzeit sind alle Date2 Einträge sind NULL. (Name, Date1) einen eindeutigen Schlüssel.
Table2 hat 2 Felder: Name und Date2. (Name, Date2) einen eindeutigen Schlüssel.
Jeder "Name" in Tabelle 1 hat mindestens einen entsprechenden Eintrag in Tabelle 2.
Jetzt möchte ich alle Date2 Einträge in Tabelle 1 aktualisieren (erinnern sie alle sind jetzt NULL) an den Date2 Eintrag in Tabelle 2, die die am nächsten ist, zu Date1 in Tabelle 1. D. h das Datum, das das Ergebnis geben würde:
min(datediff(dd,Table1.Date1,Table2.Date2))
So klar sein, wenn ich die folgenden Einträge haben:
Tabelle 1:
[Name]: Karl, [Date1]: 1.1.2009, [Date2]: NULL
Tabelle 2:
[Name]: Karl, [Date2]: 1.1.2000
[Name]: Karl, [Date2]: 2009.01.07
[Name]: Karl, [Date2]: 1.1.2010
Dann will ich Table1.Date2 zu ‚1/7/2009‘ zu aktualisieren, da diese in der Nähe Datum ‚1.1.2009‘ ist.
Vielen Dank
Karl
Lösung
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)
Andere Tipps
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
)
Überprüfen Sie, ob Sie ABS
brauchen -. Ich denke, Sie tun
Auch die Abfrage nicht den Fall umgehen kann, wo es 2 Tage, in Tabelle 2 mit dem gleichen Abstand zum Date1, aber von verschiedenen Seiten.