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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top