2011-01-21 4 views
1

아마 끔찍한 제목이 무엇인지 용서해주십시오. 나는 한 줄의 텍스트에서 내가하려고하는 것을 설명하려고 애를 썼다. 나는 그것이있는 각 파일 타입 1 개 행을 반환해야, 주어진 항목 Id를 들어여러 조건을 기반으로 상위 n 개의 행을 선택하십시오.

 
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 

:

SQL Server 2005의

나는 테이블이라고 다음과 같습니다 ItemDataSheets 있습니다. 특정 파일 유형이 둘 이상인 경우 해당 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 및 시간을 사용하여 빠른 테스트를 했나요에있어 두 번째 통계는 훨씬 더 효율적으로 보입니다. 감사! –

+0

동일한 수정 작업을 db2에서도 사용할 수 있습니다. 내부 쿼리에 * 대신에 열 이름을 배치해야합니다. –

관련 문제