SQL:在另一列上找到重复项时选择最新的日期时间值

时间:2015-04-14 14:57:09

标签: sql datetime select sql-server-2012

我正在使用SQL Server 2012。

我有一张名为service_reports的表格。该表有四列:

  1. id专栏
  2. 外键列fk_service指的是一个服务 报告是关于
  3. 表示时间点的日期时间列done_date 报告定稿时。
  4. 最后,它有一个布尔(BIT)列isFinalReport
  5. 现在,有些服务有关于它们的多个服务报告,我想要选择除引用某个服务的每个组的最新报告之外的所有报告。我想在除了引用相同服务的最新报告之外的所有内容中设置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

    任何帮助将不胜感激!谢谢。

2 个答案:

答案 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