根据多个条件选择前n行

时间:2011-01-21 14:23:12

标签: sql sql-server-2005 tsql

请原谅我可能是一个糟糕的头衔;我努力用一行文字来解释我想要做的事情。

SQL Server 2005

我有一个名为ItemDataSheets的表,如下所示:

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

对于给定的ItemId,我需要为它拥有的每个FileType返回1行。如果它有一个以上的某种文件类型,那么我需要该FileType具有最高Id的行。

因此,对于ItemId 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

1 个答案:

答案 0 :(得分: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