Sql 更新数据集中的连续行

Sql 更新数据集中的连续行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正在尝试将第一行中的EffectiveEndDTM从NULL更新为第二行中的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:

我正在尝试将第一行中的EffectiveEndDTM从NULL更新为第二行中的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

最好的方法是什么?

由于是2008 r2,您不能使用2012年引入的
lead
/
lag
函数,但这并不意味着您无法获得下一行/上一行的值。您只需要一个子查询:

创建并填充样本表(请在以后的问题中保存此步骤)

更新:

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
输出

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

您使用的是哪种DBMS?SQL Server 2008 R2,很抱歉,我没有在问题中提到这一点。
第一个
第二个
连续的
最后一个
在SQL中没有意义,除非您明确指定了一个
ORDER BY
子句。您点什么菜?
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