0

SQL サーバー 2008 の場合:

2 つのテーブルがあるとします。

Table1 には、Name、Date1、Date2 の 3 つのフィールドがあります。現在、すべての Date2 エントリは NULL です。(Name, Date1) は一意のキーを形成します。

Table2 には、Name と Date2 の 2 つのフィールドがあります。(Name, Date2) は一意のキーを形成します。

Table1 のすべての「名前」には、Table2 に少なくとも 1 つの対応するエントリがあります。

ここで、Table1 のすべての Date2 エントリ (現在はすべて NULL であることを思い出してください) を、Table1 のDate1 に最も近いTable2 の Date2 エントリに更新したいと考えています。つまり、次の結果が得られる日付です。

 min(datediff(dd,Table1.Date1,Table2.Date2))

明確にするために、次のエントリがある場合:

表1:

[名前]: カール、[日付 1]: 2009 年 1 月 1 日、[日付 2]: NULL

表 2:

[名前]: カール、[日付 2]: 2000 年 1 月 1 日

[名前]: カール、[日付 2]: 2009 年 1 月 7 日

[名前]: カール、[日付 2]: 2010 年 1 月 1 日

次に、「2009 年 1 月 1 日」に最も近い日付であるため、Table1.Date2 を「2009 年 1 月 7 日」に更新します。

どうもありがとう

カール

4

2 に答える 2

1
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)
于 2009-11-10T22:48:07.260 に答える
1
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
                                                )

必要かどうかを確認してください。必要ABSだと思います。

また、クエリは、Table2 に 2 つの日付があり、Date1 までの距離が同じであるが、両側が異なる場合を処理しません。

于 2009-10-26T06:41:03.127 に答える