while循环Sql逻辑
输入while循环Sql逻辑,sql,sql-server-2008,while-loop,Sql,Sql Server 2008,While Loop,输入 date | username | program | workflow | Pending_Audits |Audits_Carry_Forward 31-07-2018 | ram | Pre pay | Sisi | -1 | -12 27-07-2018 | ram | Pre pay | Sisi | -111 |
date | username | program | workflow | Pending_Audits |Audits_Carry_Forward
31-07-2018 | ram | Pre pay | Sisi | -1 | -12
27-07-2018 | ram | Pre pay | Sisi | -111 | 0
25-07-2018 | ram | Pre pay | Sisi | -16 | -14
我有上表,我正在写一个while条件,从给定日期更新审计结转列
逻辑是将给定日期的审核结转更新到下一行待定审核列,该列与给定日期具有相同的程序和工作流
所需输出:
date | username | program | workflow | Pending_Audits |Audits_Carry_Forward
31-07-2018 | ram | Pre pay | Sisi | -1 | -111
27-07-2018 | ram | Pre pay | Sisi | -111 | -16
25-07-2018 | ram | Pre pay | Sisi | -16 | -14
因此,在这种情况下,我想将“2018年7月25日”的未决审计数据更新为高于给定日期的审计结转数据
我尝试的sql逻辑
DECLARE @date DATE = '2018-07-25'
DECLARE @username VARCHAR(100)= 'ram'
DECLARE @program VARCHAR(100)= 'Pre pay'
DECLARE @workflow VARCHAR(100)= 'Sisi'
DECLARE @a INT
WHILE ( @date <= Cast(Getdate() AS DATE) )
BEGIN
SET @a = (SELECT Count(*)
FROM dbo.homehealthpp1
WHERE username = @username
AND program = @program
AND workflow = @workflow
AND date = @date)
IF ( @a = 1 )
BEGIN
UPDATE dbo.homehealthpp1
SET audits_carry_forward = (SELECT pending_audits
FROM dbo.homehealthpp1
WHERE username = @username
AND program = @program
AND workflow = @workflow
AND date = @date)
WHERE username = @username
AND program = @program
AND workflow = @workflow
AND date = Cast(Dateadd(d, 1, @date) AS DATE)
END
SET @date = Cast(Dateadd(d, 1, @date) AS DATE)
END
DECLARE@date日期='2018-07-25'
声明@username VARCHAR(100)='ram'
声明@program VARCHAR(100)=“预付费”
声明@workflow VARCHAR(100)='Sisi'
声明@a INT
虽然(@date假设用户名/工作流/程序
是常用值,但您可以这样做
我们在用户名/工作流/程序
上添加一个行编号()
分区,然后我们可以更新审核结转
值,以便从集合(-1)中的下一行(rn
)找到匹配的用户名/工作流/程序
),但仅当该行(rn
)不是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(逐行计算)方法,而且与基于集合的方法相比,所有数据都是同时更新的,资源成本要高得多。随着时间和经验的推移,您会发现大多数(尽管不是全部)方法无需使用循环/光标即可完成任务。我不明白。我知道最近两个日期的更新方式,但不知道2018-07-25。@GordonLinoff关于“2018-07-25”的插入数据。我想从该数据更新下一个最近的日期数据。