假设
username/workflow/program
是共同的价值观,你可以这样做。
我们添加了
row_number()
分区
用户名/工作流/程序
然后我们可以更新
audits_carry_forward
匹配的值
用户名/工作流/程序
从下面的行(
rn
)在集合中(-1),但仅当行(
氡
不是1。
DECLARE @Test TABLE ([date] DATE, username VARCHAR(100), program VARCHAR(10), workflow VARCHAR(10), pending_audits INT, audits_carry_forward INT)
INSERT INTO @Test
VALUES ('2018-07-31','ram','Pre pay','Sisi',-1,-12),
('2018-07-27','ram','Pre pay','Sisi',-111,0),
('2018-07-25','ram','Pre pay','Sisi',-16,-14)
;WITH x AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY username,program,workflow ORDER BY [date]) AS RN
FROM @Test
)
UPDATE T1 SET audits_carry_forward = (SELECT pending_audits FROM X T2 WHERE T1.username=T2.username AND T1.program=T2.program AND T1.workflow=T2.workflow AND T2.RN=T1.RN-1)
FROM X T1
WHERE T1.RN!=1
SELECT *
FROM @Test
ORDER BY [date] DESC
值得注意的是,在SQL中不建议使用循环/游标。这被称为RBAR(row by agonizing row)方法,它比基于集合的方法更昂贵,而所有数据都是同时更新的。随着时间和经验的推移,您会发现大多数(尽管不是全部)事情都可以在不使用循环/光标的情况下完成。