用以前的记录值更新最新记录
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
【讨论】:
以上是关于用以前的记录值更新最新记录的主要内容,如果未能解决你的问题,请参考以下文章