2011-01-21 78 views
1

原谅我可能是一个可怕的标题;我努力在一行文本中解释我想要做的事情。根据多个标准选择前n行

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 

对于给定的项目Id,我需要返回1行中有每个文件类型。如果它有一个以上的某种文件类型,那么我需要该文件类型的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 2011-01-21 14:37:16