使用SELECT DISTINCT& amp;时,如何显示表格中的所有列? MAX(ID)删除重复项?

时间:2012-10-18 19:42:01

标签: tsql sql-server-2005 distinct max

我有一张表,在某些情况下,对同一名员工有多个条目。

我只想要具有最高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。我们需要返回上表中的所有值。我如何在一个查询中执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以使用Common Table Expressionrow_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()函数返回具有相同FirstNameLastNamepartition 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