既然是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
哪些DBMS您使用的是真正的表? –
SQL Server 2008 R2,对不起,我错过了提到的问题。 – Sharktooth
除非您明确指定ORDER BY子句**,否则'first','second','consecutive'和'last'在SQL **中没有意义。你的订单是什么? –