2011-03-31 79 views
17

如果我有一個名爲[部件]的列[PARTID] [長度]表,[IDNumber中],以及和數據:SQL SELECT DISTINCT前2

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

我怎麼可以只選擇前2條記錄具有不同的IDNumber?搜索了一下後,我一直無法找到一個我想要的查詢。我想結果是這樣的:

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

我現在擁有的一切:

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

澄清,PARTID實際上是一個GUID。我認爲寫出每條記錄的GUID在我的示例數據中變得有點麻煩。

+2

頂部2是什麼? **在SQL中沒有默認排序。** – JNK 2011-03-31 17:24:51

+0

所以你想按照PartId的順序排列TOP 2組(由[IDNumber]定購),然後從這兩個組中選出你想要的單個最高記錄? – 2011-03-31 17:26:27

+0

通過'PartID ASC'訂購前2名? – Lamak 2011-03-31 17:26:32

回答

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不知道是否有一種方法只用一次部分掃描即可完成。 – 2011-03-31 17:32:46

+0

@Martin - 現在,操作員補充說他使用的是SQL Server 2005,也許他可以試試@Longha的回答,看看是否可以避免一次額外的掃描。 – Lamak 2011-03-31 17:35:35

+0

感謝您的回答!我忘了澄清,但我的PartID字段實際上是一個GUID。對於那個很抱歉。當我輸入樣本數據時,我認爲寫出整個GUID有點麻煩。 – MisterXero 2011-03-31 17:38:40

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]