2011-03-31 21 views
17

Ben sütunlar [PartID] ile [Bölüm] adlı tablo, [IDNumber] ve [Uzunluk] ve veri varsa: Nasıl sadece üst 2 kayıtları seçebilirsinizSQL seçin Farklı Üst 2

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

ayrı bir IDNumber ile? Biraz aradıktan sonra, istediğimi yapan bir sorgu bulamadım. Böyle görünmek sonuçları istiyorum:

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

Şu an hangi:

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

PartID aslında bir GUID olduğunu netleştirmek için. Her kaydın GUID'ini yazarken örnek verilerimde biraz karışıklık yarattığını düşünüyordum.

+2

Üst 2 ne tarafından? ** SQL'de varsayılan bir sipariş yok. ** – JNK

+0

Böylece, PartId tarafından sipariş edilen TOP 2 gruplarını ([IDNumber] ile) istediğiniz zaman, bu iki grubun her ikisinden de tek bir üst kayıt olmasını istiyorsunuz? –

+0

'PartID ASC' tarafından ilk 2 siparişi? – Lamak

cevap

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 Sadece tek bir kısmi tarama ile yapmanın bir yolu var mı merak ediyorum. –

+0

@Martin - Şimdi bu SQL Server 2005'i kullandığını ekledi, belki de Longha'nın cevabını deneyebilir ve bunun fazladan bir taramayı önleyip önlemediğini görebilir. – Lamak

+0

Cevabınız için teşekkürler! Açıklığa kavuşturmayı unuttum ama PartID alanım aslında bir GUID. Bunun için üzgünüm. Örnek veriyi yazarken, tüm GUID'yi yazmanın biraz karışık olduğunu düşündüm. – MisterXero

1

Yinelenen IDNumber için hangi satırın seçileceğinden bahsetmediniz. Örneğinizden, Min PartID'nin kullanılacağını varsayarak, aşağıdaki sorguyu kullanabilirsiniz. Biraz düzeltilmeli.

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] 
İlgili konular