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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top