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

Posted

技术标签:

【中文标题】用以前的记录值更新最新记录【英文标题】:Update latest record with previous record values 【发布时间】:2020-09-17 23:20:56 【问题描述】:

我有一个名为 Audits 的表,它有一个 CompanyId、Date、AuditNumber 字段,每个公司可以有许多审计,而 AuditNumber 字段跟踪该公司有多少审计。

我正在尝试将所有 最新 审核记录日期更新为上一个日期 + 5 年,因此假设 CompanyId 12345 有 3 次审核,我想更新第 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 专家,但这只是将 Date 更新为由于 SELECT TOP(1) 而可以找到的第一个上一个日期,但如果我不放那个 TOP(1),则子查询返回超过1 条记录,因此它会抱怨。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

不需要过程和循环。我会为此推荐窗口函数和可更新的 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

公用表表达式按审计编号降序排列具有同一公司的记录,并检索上一次审计的日期。外部查询过滤每个组的顶部记录,并将日期更新为前一个日期之后的 5 年。

当一家公司只有一次审计时,您没有告诉该怎么做。我添加了一个条件以不更新这些行(如果有)。

【讨论】:

谢谢,帮了大忙。【参考方案2】:

你必须先将 row_number 添加到你的 result_tbl,然后加入 result_tbl 并开启 self Al.CompanyId=A2.CompanyId AND Al.IND=1 AND A2.IND=2,现在你有最新记录和以前的记录在一个记录中,你可以更新原始表

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

【讨论】:

以上是关于用以前的记录值更新最新记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中获取最新的活动记录?

Netsuite - 加载前的 Suitescript 用户事件 - 获取子列表值加入 -> 设置子列表值自定义子记录

SQL Server:从最大日期/最新日期的记录中获取数据

SQL 跟踪最新记录和更新

SQL Server 仅更新组中的最新记录

退役前的做题记录