首先,你需要應用而不是Table2
,在PeriodStart
上進行分區並按ModifiedDate
(desc)進行排序。致電MaxModified
; 1總是最近修改的記錄。
pK2 PeriodStart ModifiedDate MaxModified
3 2016-03-01 00:00:00.000 2016-04-01 00:00:00.000 1
5 2016-05-01 00:00:00.000 2016-06-02 00:00:00.000 1
4 2016-05-01 00:00:00.000 2016-06-01 00:00:00.000 2
然後,只在MaxModified=1
,你添加一個新的「ID」這個,所以我們可以排隊的開始日期,與下一行的開始日期(我們的結束日期)。這也是由PeriodStart
訂購的row_number()
函數完成的。
pK2 PeriodStart ModifiedDate MaxModified myID
3 2016-03-01 00:00:00.000 2016-04-01 00:00:00.000 1 1
5 2016-05-01 00:00:00.000 2016-06-02 00:00:00.000 1 2
然後我們把這個結果加入到它自己的偏移一行中,以得到每個原始行的結束日期值。
pK2 PeriodStart ModifiedDate MaxModified myID PeriodEnd
3 2016-03-01 00:00:00.000 2016-04-01 00:00:00.000 1 1 2016-05-01 00:00:00.000
5 2016-05-01 00:00:00.000 2016-06-02 00:00:00.000 1 2 NULL
一旦我們有,它的加入對起點的簡單事情/結束日期,讓我們的pk2
值。
完整劇本...
DECLARE @Table1 TABLE (pK1 INT, PeriodStart DATETIME, pK2 INT)
DECLARE @Table2 TABLE (pK2 INT, PeriodStart DATETIME, ModifiedDate DATETIME)
INSERT INTO @Table1
VALUES (1,'2016-04-01',NULL),
(2,'2016-07-01',NULL)
INSERT INTO @Table2
VALUES (3,'2016-03-01','2016-04-01'),
(4,'2016-05-01','2016-06-01'),
(5,'2016-05-01','2016-06-02')
;WITH OrderedList AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY PeriodStart ORDER BY ModifiedDate DESC) AS MaxModified
FROM @Table2
),X AS
(
SELECT *,
ROW_NUMBER() OVER(ORDER BY PeriodStart) AS myID
FROM OrderedList
WHERE MaxModified=1
), Y AS
(
SELECT L.*, R.PeriodStart AS PeriodEnd
FROM X L
LEFT JOIN X R ON L.myID=R.myID-1 AND R.MaxModified=1
WHERE L.MaxModified=1
)
UPDATE T SET pK2=Y.pK2
FROM @Table1 T
LEFT JOIN Y ON T.PeriodStart >= Y.PeriodStart AND T.PeriodStart < COALESCE(Y.PeriodEnd,CURRENT_TIMESTAMP)
SELECT *
FROM @Table1
那是怎麼您的數據存儲真的還是是多麼你鍵入了?基於字符串進行日期評估非常麻煩。另外,你有什麼嘗試,請顯示努力。 – JiggsJedi
這就是我爲了便於描述而鍵入的。這兩列都是DateTime。 – CorribView
然後,你需要解決這個問題...並展示你的嘗試。 – JiggsJedi