atualização SQL para gravar com os dados mais próximos
-
06-07-2019 - |
Pergunta
servidor No SQL 2008:
Suponha que eu tenho duas tabelas.
Tabela 1 tem 3 campos: Nome, data1 e data2. Atualmente, todas as entradas date2 são NULL. (Nome, Date1) formam uma chave única.
Tabela2 tem 2 campos: Nome e data2. (Nome, data2) formam uma chave única.
Cada "Nome" na Tabela 1 tem pelo menos uma entrada correspondente na Table2.
Agora, eu quero atualizar todas as entradas date2 na Tabela 1 (lembre-se que eles são todos NULL agora) para a entrada Date2 em Table2 que é o mais próximo para Date1 na Tabela 1. Ou seja, a data em que lhe daria o resultado de:
min(datediff(dd,Table1.Date1,Table2.Date2))
Assim, para ser claro, se eu tiver as seguintes entradas:
Tabela 1:
[Nome]: Karl, [Date1]: 1/1/2009, [data2]: NULL
Table2:
[Nome]: Karl, [data2]: 1/1/2000
[Nome]: Karl, [data2]: 1/7/2009
[Nome]: Karl, [data2]: 1/1/2010
Então eu quero atualizar Table1.Date2 para '1/7/2009' uma vez que é a data mais próxima '1/1/2009'.
Muito obrigado
Karl
Solução
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)
Outras dicas
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
)
verificar se você precisa ABS
-. Eu acho que você faça
Além disso, a consulta não lidar com o caso onde há 2 datas em Table2 com a mesma distância para o Date1, mas a partir de lados diferentes.