通过CTE'获取最新的行。返回重复值的查询

时间:2015-11-10 03:46:32

标签: sql sql-server select

我有一个现有的查询,它使用'与CTE'功能。此查询返回我想要的结果,但是,查询还返回重复值但具有不同的更新日期。举个例子,查询返回如下结果:

NAME     MACHINE   SUPERVISOR    LAST_UPDATE
NAME_1   T_001     SUP_1         2015-10-14 09:55:26.637
NAME_2   T_002     SUP_2         2015-10-14 09:54:07.087
NAME_2   T_002     SUP_3         2015-10-14 10:02:31.663 
NAME_3   T_003     SUP_4         2015-10-14 09:53:28.253 
NAME_4   T_005     SUP_4         2015-10-14 09:55:47.293
NAME_3   T_003     SUP_3         2015-10-14 09:59:00.000
NAME_3   T_003     SUP_3         2015-10-12 08:19:00.000

我想只选择具有相同名称的行和具有最新更新日期的计算机。期望的结果应该是:

NAME     MACHINE   SUPERVISOR    LAST_UPDATE
NAME_1   T_001     SUP_1         2015-10-14 09:55:26.637
NAME_2   T_002     SUP_3         2015-10-14 10:02:31.663 
NAME_4   T_005     SUP_4         2015-10-14 09:55:47.293
NAME_3   T_003     SUP_3         2015-10-14 09:59:00.000
NAME_3   T_003     SUP_3         2015-10-12 08:19:00.000

请注意,每天都会选择最新行。看看NAME_3。它会在同一天删除另一行,但不会删除在不同日期更新的行。

请记住,有一个现有的查询,我希望只是集成另一个将获得上述所需结果的查询。提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果某一天的参赛作品超过1个,那么如果每天需要一条记录,则必须order by hourminuteseconds。< / p>

select name, machine, supervisor, last_update
from (select *,
      row_number() over (partition by name, course, cast(last_update as date)
                         order by last_update desc,
                         datepart(hh,last_update),            
                         datepart(minute,last_update), 
                         datepart(second,last_update)) as rn
     from tablename
     ) t
where rn = 1

答案 1 :(得分:1)

要删除重复的列,您可以使用

ROW_NUMBER()PARTITION BY duplicated columns然后删除rownum > 1

ROW_NUMBER()RANK()PARTITION BY duplicated columns然后删除包含rownum <> rank

的行

您的代码如下:

;WITH CTE AS
(
   SELECT NAME, MACHINE, SUPERVISOR, LAST_UPDATE
   FROM ...
   WHERE ...
)
SELECT * FROM
(
   SELECT *,
      ROW_NUMBER() OVER(PARTITION BY NAME, MACHINE, CONVERT(DATE, LAST_UPDATE)
                        ORDER BY LAS_UPDATE DESC) AS rownum
   FROM CTE
)
WHERE rownum = 1