使用以前的记录值更新最新记录

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