我有一个现有的查询,它使用'与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。它会在同一天删除另一行,但不会删除在不同日期更新的行。
请记住,有一个现有的查询,我希望只是集成另一个将获得上述所需结果的查询。提前谢谢!
答案 0 :(得分:1)
如果某一天的参赛作品超过1个,那么如果每天需要一条记录,则必须order by
hour
,minute
和seconds
。< / 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