2016-07-25 75 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