2016-07-25 74 views
-1

我試圖將第一行中的EffectiveEndDTM從第二行更新爲LoadDTM值,對於除最後一行之外的所有行都將保持爲NULL。從數據集中更新連續行

EffectiveStartDTM  EffectiveEndDTM CurrentRecInd LoadID LoadDTM 
2016-06-13 13:05:09.000 NULL   1    130272 2016-06-13 13:05:09.000 
2016-06-27 10:27:13.000 NULL   1    133819 2016-06-27 10:27:13.000 
2016-07-04 10:05:23.000 NULL   1    135323 2016-07-04 10:05:23.000 
2016-07-11 12:11:52.000 NULL   1    136943 2016-07-11 12:11:52.000 

這樣做的最好方法是什麼?

+0

哪些DBMS您使用的是真正的表? –

+0

SQL Server 2008 R2,對不起,我錯過了提到的問題。 – Sharktooth

+0

除非您明確指定ORDER BY子句**,否則'first','second','consecutive'和'last'在SQL **中沒有意義。你的訂單是什麼? –

回答

1
DECLARE @T As Table 
(
    EffectiveStartDTM datetime, 
    EffectiveEndDTM datetime, 
    CurrentRecInd tinyint, 
    LoadID int, 
    LoadDTM datetime 
) 

INSERT INTO @T VALUES 
('2016-06-13 13:05:09.000', NULL, 1, 130272, '2016-06-13 13:05:09.000'), 
('2016-06-27 10:27:13.000', NULL, 1, 133819, '2016-06-27 10:27:13.000'), 
('2016-07-04 10:05:23.000', NULL, 1, 135323, '2016-07-04 10:05:23.000'), 
('2016-07-11 12:11:52.000', NULL, 1, 136943, '2016-07-11 12:11:52.000') 

;WITH cte 
AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY LoadID) AS RowId 
    FROM 
     @T 
) 

SELECT 
    A.LoadID, 
    B.LoadDTM 
FROM 
    cte A LEFT JOIN 
    (
     SELECT cte.RowId -1 AS RowId, cte.LoadDTM FROM cte 
    ) B ON A.RowId = B.RowId 
WHERE 
    A.EffectiveEndDTM IS NULL 

輸出

LoadID LoadDTM 
130272 2016-06-27 10:27:13.000 
133819 2016-07-04 10:05:23.000 
135323 2016-07-11 12:11:52.000 
136943 NULL 

更新

UPDATE YourTable 
SET EffectiveEndDTM = R.LoadDTM 
FROM 
(
    SELECT 
     A.LoadID, 
     B.LoadDTM 
    FROM 
     cte A LEFT JOIN 
     (
      SELECT cte.RowId -1 AS RowId, cte.LoadDTM FROM cte 
     ) B ON A.RowId = B.RowId 
    WHERE 
     A.EffectiveEndDTM IS NULL 
) R 
WHERE 
    YourTable.LoadID = R.LoadID 
1

既然是2008年r2,那麼您不能使用2012年推出的lead/lag函數,但這並不意味着您無法獲得下一個/ prev行的值。你只需要一個子查詢:

創建和填充示例表(保存我們這一步在你未來的問題)

DECLARE @T As Table 
(
    EffectiveStartDTM datetime, 
    EffectiveEndDTM datetime, 
    CurrentRecInd tinyint, 
    LoadID int, 
    LoadDTM datetime 
) 

INSERT INTO @T VALUES 
('2016-06-13 13:05:09.000', NULL, 1, 130272, '2016-06-13 13:05:09.000'), 
('2016-06-27 10:27:13.000', NULL, 1, 133819, '2016-06-27 10:27:13.000'), 
('2016-07-04 10:05:23.000', NULL, 1, 135323, '2016-07-04 10:05:23.000'), 
('2016-07-11 12:11:52.000', NULL, 1, 136943, '2016-07-11 12:11:52.000') 

更新:

UPDATE T1 
SET EffectiveEndDTM = (
    SELECT TOP 1 EffectiveStartDTM 
    FROM @T T2 
    WHERE T2.EffectiveStartDTM > T1.EffectiveStartDTM 
    ORDER BY T2.EffectiveStartDTM 
) 
FROM @T T1 

測試更新成功:

SELECT EffectiveStartDTM, EffectiveEndDTM, CurrentRecInd, LoadID, LoadDTM 
FROM @T 

結果:

EffectiveStartDTM  EffectiveEndDTM   CurrentRecInd LoadID  LoadDTM 
----------------------- ----------------------- ------------- ----------- ----------------------- 
2016-06-13 13:05:09.000 2016-06-27 10:27:13.000 1    130272  2016-06-13 13:05:09.000 
2016-06-27 10:27:13.000 2016-07-04 10:05:23.000 1    133819  2016-06-27 10:27:13.000 
2016-07-04 10:05:23.000 2016-07-11 12:11:52.000 1    135323  2016-07-04 10:05:23.000 
2016-07-11 12:11:52.000 NULL     1    136943  2016-07-11 12:11:52.000