Sql 更新数据集中的连续行
我正在尝试将第一行中的EffectiveEndDTM从NULL更新为第二行中的LoadDTM值,并且类似地,将所有行(最后一行除外)的值更新为NULLSql 更新数据集中的连续行,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:
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