我有一张表,在某些情况下,对同一名员工有多个条目。
我只想要具有最高ID的员工记录。
表结构示例&数据
ID FirstName LastName Initials AreaID SupervisorID Forms JobClass JobTitle
----------------------------------------------------------------------------------------
805/ Trey/ W/ TW/ 93/ 404/ 99/NA/ Temporary/ R1_Temp
752/ Trey/ W/ TW/ 93/ 404/ 99/NA/ Temporary/ R1_Temp
399/ Ron/ V/ RV/ 144/ NULL/ 99/NULL/ NULL/ NULL
374/ Ron/ V/ RV/ 94/ NULL/ 99/NULL/ NULL/ NULL
379/ Ron/ V/ NULL/ 0/ NULL/ 99/NULL/ NULL/ NULL
378/ Dax/ T/ NULL/ 0/ NULL/ 40/NULL/ NULL/ NULL
373/ Dax/ T/ DT/ 94/ NULL/ 40/NULL/ NULL/ NULL
398/ Dax/ T/ DT/ 94/ 276/ 99/NULL/ NULL/ NULL
如您所见,Ron V.有三个条目。
目前有大约1000个条目(包括重复条目)。下面的查询返回~700(不包括重复项),这是正确的。
SELECT DISTINCT LastName, MAX(ID) as ID
FROM Employees GROUP BY LastName
order by LastName DESC
这只返回ID和LastName。我们需要返回上表中的所有值。我如何在一个查询中执行此操作?
谢谢!
答案 0 :(得分:4)
您可以使用Common Table Expression和row_number()功能为每个不同的FirstName
/ LastName
对选择ID最大的行。
这是SELECT
声明:
;with DistinctByName as (
select
*,
row_number()
over (
partition by FirstName, LastName
order by ID desc
) as RowNumber
from Employees
)
select
[ID],
[FirstName], [LastName], [Initials],
[AreaID], [SupervisorID], [Forms],
[JobClass], [JobTitle]
from DistinctByName
where RowNumber = 1
您可以在线试用此代码:http://www.sqlfiddle.com/#!3/a791e/2
有关其原因的简要说明:
上面的row_number()
函数返回具有相同FirstName
和LastName
(partition by
子句)的所有行中当前行的索引,按{{ 1}}。
ID
子句中不能出现row_number()
函数,因此我们必须将选择包装在CTE中,以便能够按此值进行过滤。
外部WHERE
语句的条件为SELECT
,这意味着对于eny不同的FirstName / LastName对,我们只会获取具有最高where RowNumber = 1
的记录。
答案 1 :(得分:0)
你可以重新加入桌面。像下面这样的东西可能会起作用。
SELECT * FROM (
SELECT DISTINCT LastName, MAX(ID) as ID FROM Employees
) distinctRows
inner join Employees e on e.ID = distinctRows.ID