2011-01-21 21 views
1

おそらくひどいタイトルのために私を許してください。私は1行のテキストで何をしようとしているのかを説明するのに苦労しました。複数の基準に基づいて上位n行を選択してください

SQL Server 2005の

私はこのようになりますItemDataSheetsと呼ばれるテーブルがあります。与えられたアイテムIDについては

 
Id ItemId FilePath    FileDescription FileType 
------------------------------------------------------------------ 
1 JOD141 /files/JOD141_a.pdf  DataSheet ABC  1 
2 JOD141 /files/JOD141_b.pdf  DataSheet LMN  1 
3 JOD141 /files/JOD141_c.pdf  DataSheet XYZ  2 
4 JOD141 /files/JOD141_d.pdf  DataSheet POI  3 
5 JOD141 /files/JOD141_e.pdf  DataSheet QWE  3 

を、私はそれが持つ各ファイル形式により1行を返す必要があります。 1つ以上のファイルタイプがある場合、そのFileTypeのIDが最も高い行が必要です。

だから、アイテムID JOD141のために、私は戻って欲しいと思います:

 
Id ItemId FilePath    FileDescription FileType 
------------------------------------------------------------------ 
2 JOD141 /files/JOD141_b.pdf  DataSheet LMN  1 
3 JOD141 /files/JOD141_c.pdf  DataSheet XYZ  2 
5 JOD141 /files/JOD141_e.pdf  DataSheet QWE  3 

答えて

7
SELECT * 
FROM 
    ItemDataSheets i 
    INNER JOIN (SEELECT max(id) id, 
         fileType 
       from ItemDataSheets 
       GROUP BY 
        fileType) maxdID 
    on i.filetype = maxid.filetype 
     and i.id = mqaxid.id 

または

SELECT 
    *  
FROM (SELECT 
      *, 
      ROW_NUMBER() OVER(partition BY fileType ORDER BY id DESC) AS RankValue 
      FROM ItemDataSheets 
    ) i 
WHERE RankValue=1 
+0

心配はありません、あなたが最初に入った:) – Blorgbeard

+0

はIOと時間を使って簡単なテストをしました統計では、2番目の方がずっと効率的です。ありがとう! –

+0

同じ変更は小規模な変更でも同様です。 *内部クエリに*の代わりに列名を配置する必要があります。 –

関連する問題