2012-10-31 6 views
8

Ben her kimlik Bunasıl bir alt sorgu kullanmadan maksimum diziden sadece satırı seçmek için?

SELECT ID, Age 
FROM Persons a 
WHERE Seq = (SELECT MAX(Seq) FROM Persons b WHERE a.ID = b.ID) 

çalışmak için görünür Ama bu en iyi yoldur

ID | Seq | Age 
------------------- 
A  1  20 
A  2  30 
B  1  25 
B  2  32 
B  3  44 
B  4  48 
C  1  11 

, tek yol için en yüksek seq ile sadece satırı seçmek için çalışıyorum? Gerekmiyorsa alt sorguları kullanmaktan hoşlanmıyorum ve hatırlıyorum ki bir şey kullanabilirsiniz ama ne olduğunu unuttum. Herhangi bir fikir?

+0

? uyumlu kahin sonra eğer –

+0

Ağırlıklı olarak SQL Server, ama bu i SQl-Fiddle ile test ettik – jenswirf

+0

My 'ROW_NUMBER' yaklaşım Oracle olarak da çalışır müthiş. Cevabımdaki bağlantıya bir bakın. –

cevap

5

SQL Server (> = 2005) ya da Oracle varsayarsak (10g?):

WITH CTE AS 
( 
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Seq DESC) AS RN 
     , ID, Age 
    FROM 
     Persons 
) 
SELECT ID, Age 
FROM CTE 
WHERE RN = 1 

ROW_NUMBER bir sonuç kümesinde bir bölüm içinde üst üste sıralı numarasını döndürür. - vs.

select * 
from 
(
    select *, row_number() over (partition by id order by age desc) rn 
    from yourtable 
) v 
where rn = 1 

Bu irade Rank(), Row_number(), http://sqlfiddle.com/#!4/b7e79/2/0 Genelde

+0

teşekkürler beynime serinletici için, geçmişte ve uzun bir aradan sonra şimdi kullanarak bu kullanılan bu mükemmel çalışıyor! – superachu

1

, sen pencereleme veya sıralama işlevleri kullanmak neeed:

Düzenleme: Burada gördüğünüz gibi Oracle'da da çalışır SQL Server 2005+ çalışmak - oracle yerine *

+0

Bu benim de düşündüğüm en iyi yol. Ancak, içinde iki seçme hükümler vardır ve bunu beğenmezseniz, sadece seçkin iç ve uygulamada gerçekleştirdiğiniz 1 sırada değil her şeyi uğurladı olabilir;) – OzrenTkalcecKrznaric

1

jus arasında, açıkça alan adlarını belirtmeniz gerekebilir

SELECT Persons.ID, Persons.Age, Persons.Seq 
FROM Persons 
     INNER JOIN 
     ( SELECT Persons.ID, MAX(Seq) AS Seq 
      FROM Persons 
      GROUP BY Persons.ID 
     ) MaxP 
      ON MaxP.ID = Persons.ID 
      AND MaxP.Seq = Persons.Seq 

Hala bir alt sorgu içerir, ama sahip olmayan bunu yapmanın bir yolunu göremiyorum, ne de gerçekten yapmak: Eğer pencere fonksiyonları desteklemeyen bir RDBMS kullanmak durumunda t kullanabilirsiniz Onları neden önlemek istediğini anla. Kullandığınız hangi rdbms