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 には 3 つのエントリがあります。

現在、約 1000 件のエントリがあります (重複を含む)。以下のクエリは、正しい ~700 (重複を除く) を返します。

SELECT DISTINCT LastName, MAX(ID) as ID
FROM Employees GROUP BY LastName 
order by LastName DESC

これは、ID と LastName のみを返します。上記の表のすべての値を返す必要があります。単一のクエリでそれを行うにはどうすればよいですか?

ありがとうございました!

4

2 に答える 2

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

これが機能する理由についての簡単な説明: 上記の関数は、同じand (節)row_number()を持つすべての行の中で現在の行のインデックスを の降順で返します。FirstNameLastNamepartition byID

row_number()関数は句に表示できないためWHERE、この値でフィルタリングできるようにするには、select を CTE でラップする必要があります。

外側のSELECTステートメントには condition がありますwhere RowNumber = 1。つまり、eny の異なる 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 に答える