web-dev-qa-db-fra.com

SQL Select Distinct Top 2

Si j'ai une table nommée [Part] avec des colonnes [PartID], [IDNumber] et [Length] et des données:

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

Comment puis-je sélectionner uniquement les 2 premiers enregistrements avec un IDNumber distinct? Après avoir cherché un peu, je n'ai pas pu trouver une requête qui fait ce que je veux. J'aimerais que les résultats ressemblent à ceci:

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

Ce que j'ai maintenant:

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

Pour clarifier que le PartID est en fait un GUID. Je pensais qu'écrire le GUID pour chaque enregistrement devenait un peu décousu dans mes données d'exemple.

23
MisterXero
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
49
Longha
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 
4
Lamak

Vous n'avez pas indiqué quelle ligne sélectionner pour IDNumber en double. Dans votre exemple, en supposant que Min PartID doit être utilisé, vous pouvez utiliser la requête suivante. Il faudrait le peaufiner un peu.

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]
1
amit_g