2011-03-31 81 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]