【问题标题】: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 条记录,因此它会抱怨。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-update window-functions


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多