使用以前的记录值更新最新记录
Update latest record with previous record values
我有一个名为 Audits 的 table,它有一个 CompanyId、Date、AuditNumber 字段,每个公司可以有很多审计,AuditNumber 字段跟踪该公司有多少审计。
我正在尝试更新所有 最新的 审计记录日期为之前的日期 + 5 年,所以说 CompanyId 12345 有 3 次审计,我想更新第 3 次审计(第三次审计是最新一次)记录日期与第二次审计记录日期 + 未来 5 年等...基本上对所有 最新 记录执行此操作。
到目前为止,我已经尝试使用 while 循环来执行此操作,但我很困惑,因为它并没有完全按照我的意愿执行...
DECLARE @counter INT = 1;
WHILE(@counter <= (SELECT COUNT(*) FROM Audits WHERE AuditNumber > 1)
BEGIN
UPDATE Audits
SET Date = CASE
WHEN AuditNumber > 1 THEN (SELECT TOP 1 DATEADD(YEAR, 5, Date) FROM Audits WHERE AuditNumber < (SELECT(MAX(AuditNumber) FROM Audits))
END
WHERE AuditNumber > 1
SET @counter = @counter + 1
END
我不是 SQL 方面的专家,但是由于 SELECT TOP(1),这只是将日期更新为它可以找到的第一个先前日期,但如果我不输入TOP(1) 子查询 returns 多于 1 条记录所以它抱怨。
如有任何帮助,我们将不胜感激。
谢谢!
不需要过程和循环。为此,我会推荐 window 函数和一个 updatable cte:
with cte as (
select date,
row_number() over(partition by company order by auditnumber desc) rn,
lag(date) over(partition by company order by auditnumber) lag_date
from audits
)
update cte
set date = dateadd(year, 5, lag_date)
where rn = 1 and lag_date is not null
常见的table表达式按审计编号降序排列具有同一公司的记录,并检索上一次审计的日期。外部查询过滤每组的顶部记录,并将日期更新为前一个日期后 5 年。
当一家公司只有一次审计时,你没有告诉该怎么做。我添加了一个条件来不更新那些行,如果有的话。
您必须先将 row_number 添加到您的 result_tbl 然后加入 result_tbl 并且自己打开
Al.CompanyId=A2.CompanyId AND Al.IND=1 AND A2.IND=2,现在一条记录中有最新记录和上一条记录,你可以更新原来的 table
WITH A AS
(
SELECT *,ROW_NUMBER(PARTITION BY CompanyId ORDER BY AuditNumber DESC) IND FROM Audits
),B AS
(
SELECT Al.CompanyId,A1.AuditNumber,A2.[DATE] FROM A A1 INNER JOIN A A2 ON Al.CompanyId=A2.CompanyId AND Al.IND=1 AND A2.IND=2
)UPDATE _Audits SET _Audits.[Date]= DATEADD(YEAR,5,B.[DATE]) FROM
B LEFT JOIN Audits _Audits ON B.CompanyId=_Audits.CompanyId AND B.AuditNumber=_Audits.AuditNumber
我有一个名为 Audits 的 table,它有一个 CompanyId、Date、AuditNumber 字段,每个公司可以有很多审计,AuditNumber 字段跟踪该公司有多少审计。
我正在尝试更新所有 最新的 审计记录日期为之前的日期 + 5 年,所以说 CompanyId 12345 有 3 次审计,我想更新第 3 次审计(第三次审计是最新一次)记录日期与第二次审计记录日期 + 未来 5 年等...基本上对所有 最新 记录执行此操作。
到目前为止,我已经尝试使用 while 循环来执行此操作,但我很困惑,因为它并没有完全按照我的意愿执行...
DECLARE @counter INT = 1;
WHILE(@counter <= (SELECT COUNT(*) FROM Audits WHERE AuditNumber > 1)
BEGIN
UPDATE Audits
SET Date = CASE
WHEN AuditNumber > 1 THEN (SELECT TOP 1 DATEADD(YEAR, 5, Date) FROM Audits WHERE AuditNumber < (SELECT(MAX(AuditNumber) FROM Audits))
END
WHERE AuditNumber > 1
SET @counter = @counter + 1
END
我不是 SQL 方面的专家,但是由于 SELECT TOP(1),这只是将日期更新为它可以找到的第一个先前日期,但如果我不输入TOP(1) 子查询 returns 多于 1 条记录所以它抱怨。
如有任何帮助,我们将不胜感激。
谢谢!
不需要过程和循环。为此,我会推荐 window 函数和一个 updatable cte:
with cte as (
select date,
row_number() over(partition by company order by auditnumber desc) rn,
lag(date) over(partition by company order by auditnumber) lag_date
from audits
)
update cte
set date = dateadd(year, 5, lag_date)
where rn = 1 and lag_date is not null
常见的table表达式按审计编号降序排列具有同一公司的记录,并检索上一次审计的日期。外部查询过滤每组的顶部记录,并将日期更新为前一个日期后 5 年。
当一家公司只有一次审计时,你没有告诉该怎么做。我添加了一个条件来不更新那些行,如果有的话。
您必须先将 row_number 添加到您的 result_tbl 然后加入 result_tbl 并且自己打开 Al.CompanyId=A2.CompanyId AND Al.IND=1 AND A2.IND=2,现在一条记录中有最新记录和上一条记录,你可以更新原来的 table
WITH A AS
(
SELECT *,ROW_NUMBER(PARTITION BY CompanyId ORDER BY AuditNumber DESC) IND FROM Audits
),B AS
(
SELECT Al.CompanyId,A1.AuditNumber,A2.[DATE] FROM A A1 INNER JOIN A A2 ON Al.CompanyId=A2.CompanyId AND Al.IND=1 AND A2.IND=2
)UPDATE _Audits SET _Audits.[Date]= DATEADD(YEAR,5,B.[DATE]) FROM
B LEFT JOIN Audits _Audits ON B.CompanyId=_Audits.CompanyId AND B.AuditNumber=_Audits.AuditNumber