2

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

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

谢谢!

4

2 回答 2

4

您可以使用公用表表达式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()上面的函数返回当前行在所有具有相同FirstNameLastNamepartition by子句)的行中的索引,按 . 的降序排列ID

row_number()函数不能出现在WHERE子句中,因此我们必须将 select 包装在 CTE 中,以便能够按此值进行过滤。

外部SELECT语句有条件where RowNumber = 1,这意味着对于任何不同的 FirstName/LastName 对,我们只取最高的记录ID

于 2012-10-18T19:55:57.010 回答
0

你可以重新加入餐桌。像下面这样的东西应该可以工作。

SELECT * FROM (
    SELECT DISTINCT LastName, MAX(ID) as ID FROM Employees
) distinctRows
inner join Employees e on e.ID = distinctRows.ID
于 2012-10-18T19:53:44.760 回答