2011-03-31 3 views
17

나는 열 [PartID]와 [부]라는 이름의 테이블, [IDNumber] 및 [길이] 데이터가있는 경우 : 어떻게 난 그냥 상위 2 레코드를 선택할 수 있습니다SQL은 선택 고유 최고 2

[PartID] [IDNumber] [Length] 
1   Test1  50 
2   Test1  60 
3   Test2  50 
4   Test3  70 

을 뚜렷한 IDNumber가 있습니까? 조금 검색 한 후에 내가 원하는 것을 수행하는 쿼리를 찾을 수 없었습니다. 나는 같이하는 결과를 싶습니다

[PartID] [IDNumber] [Length] 
1   Test1  50 
3   Test2  50 

내가 지금 무엇을 가지고 :

Select distinct top 2 
     [PartID], 
     [IDNumber], 
     [Length] 
from 
    [Part] 

가 PartID 실제로 GUID임을 명확히하기 위해. 각 레코드의 GUID를 작성하는 것이 예제 데이터에서 약간 엉망이되고 있다고 생각했습니다.

+2

탑이 무엇으로? ** SQL에는 기본 순서가 없습니다 ** – JNK

+0

PartID로 정렬 된 TOP 2 그룹 ([IDNumber] 기준)을 원한다면이 두 그룹 모두에서 단일 최상위 레코드를 원하십니까? –

+0

PartID ASC에 의한 상위 2 개의 주문? – Lamak

답변

41
SELECT DISTINCT TOP 2 PartId, IdNumber, Length 
FROM 
( SELECT PartId, IdNumber, Length, ROW_NUMBER() over(partition by IdNumber order by Length) Orden 
    FROM [Ayuda] 
) A 
WHERE A.Orden = 1 
ORDER BY Length 
3
SELECT TOP 2 b.* 
FROM (SELECT idnumber, 
       MIN(partid) partid 
     FROM part 
     GROUP BY idnumber) a 
     JOIN part b 
     ON a.partid = b.partid 
ORDER BY b.partid 
+0

+1 단 하나의 부분적인 스캔으로 그것을하는 방법이 있다면 궁금해. –

+0

@Martin - 이제 SQL Server 2005를 사용하고 있다고 덧붙여서 @Longha의 대답을 시도해 볼 수 있으며 추가 스캔을 피할 수 있는지 알아볼 수 있습니다. – Lamak

+0

답변 해 주셔서 감사합니다! 나는 분명히 잊어 버렸지 만 PartID 필드는 사실 GUID입니다. 미안합니다. 필자가 생각한 샘플 데이터를 입력 할 때 전체 GUID를 작성하는 것이 다소 지저분했습니다. – MisterXero

1

중복 IDNumber에 대해 선택할 행을 언급하지 않았습니다. Min PartID를 사용한다고 가정하면 다음 쿼리를 사용할 수 있습니다. 그것은 조금 비틀어 질 필요가있을 것입니다.

Select Top 2 
    P.* 
From 
    [Part] P 
Inner Join 
    (
     Select 
      [IDNumber] 
      ,Min([PartID]) As MinPartID, 
     From 
      [Part] 
     Group By 
      [IDNumber] 
    ) T 
On 
    P.PartID = T.MinPartID 
    And 
    P.IDNumber = T.IDNumber -- May not be needed is PartID is primary Key 
Order By 
    P.[PartID] 
    ,P.[IDNumber]