我正在使用SQL Server 2012。
我有一张名为service_reports
的表格。该表有四列:
id
专栏fk_service
指的是一个服务
报告是关于done_date
报告定稿时。isFinalReport
。现在,有些服务有关于它们的多个服务报告,我想要选择除引用某个服务的每个组的最新报告之外的所有报告。我想在除了引用相同服务的最新报告之外的所有内容中设置isFinalReport
布尔值,为false。从而留下最新的service_report
作为最终报告。
示例:service_reports
行(id
)10 11和12都引用fk_service
25,因此service_reports
表中有三行引用相同的行fk_service
。
现在,让我们说第12行是这三份报告中的最新一份。我想在isFinalReport
10和11中将service_reports
设置为false。
我需要对表格中的所有条目执行此操作,其中多个service_report
引用相同的fk_service
任何帮助将不胜感激!谢谢。
答案 0 :(得分:1)
我想我实际上会在触发器中执行此操作,当添加新行时,它会将isFinalReport设置为false,以用于其较旧的兄弟节点。
但这就是我回答你问题的方法:
update a
set a.isFinalReport = false
from service_reports a
where isnull(a.isFinalReport, 1) = 1
and exists
(select 1
from service_reports b
where b.fk_service = a.fk_service
and b.done_date > a.done_date)
答案 1 :(得分:0)
DECLARE @service_reports TABLE
(
id INT PRIMARY KEY,
fk_service INT,
done_date DATETIME,
isFinalReport BIT
)
INSERT INTO @service_reports
(
id
,fk_service
,done_date
,isFinalReport
)
VALUES
(
10
,25
,'2015-04-14'
,1
)
INSERT INTO @service_reports
(
id
,fk_service
,done_date
,isFinalReport
)
VALUES
(
11
,25
,'2015-04-15'
,1
)
INSERT INTO @service_reports
(
id
,fk_service
,done_date
,isFinalReport
)
VALUES
(
12
,25
,'2015-04-16'
,1
)
UPDATE sr
SET sr.isFinalReport = 0
FROM @service_reports sr
JOIN
(
SELECT id,
ROW_NUMBER() OVER (PARTITION BY fk_service ORDER BY done_date DESC) AS rowNumber
FROM @service_reports
) s
ON s.id = sr.id
WHERE s.rowNumber > 1
SELECT *
FROM @service_reports