2011-10-09 27 views
9

Sorgu emirlerinin sayılan ve en üst sırayı aldığı örnekleri gördük ancak bu durumda çoklu "en sık" değerler olabilir, bu yüzden tek bir sonuçtan daha fazlasını iade etmek isteyebilirim. Bir kullanıcıların tabloda en sık görülen soyadlarını bulmak istiyorum Bu durumda En sık görünen değerler nasıl seçilir?

, burada ben bugüne kadar ne:

select last_name from users group by last_name having max(count(*)); 

Ne yazık ki bu sorgu ile benim max işlevi iç içe olan bir hata alıyorum çok derinden.

cevap

23
select 
    x.last_name, 
    x.name_count 
from 
    (select 
    u.last_name, 
    count(*) as name_count, 
    rank() over (order by count(*) desc) as rank 
    from 
    users u 
    group by 
    u.last_name) x 
where 
    x.rank = 1 

rank analitik işlevini kullanın. count(*) desc sırasına göre bir numaralandırma atayacaktır. İki isim aynı sayıya sahipse, aynı sıralamaya ulaşırlar ve bir sonraki sayı atlanır (böylece satır 1, 1 ve 3'e sahip olabilirsiniz). dense_rank, iki satır aynı sıralamaya sahipse (1, 1, 2 elde ederseniz) bir sonraki sayıyı geçmeyen bir alternatiftir, ancak yalnızca 1. sıradaki satırları istiyorsanız, farkı.

Yalnızca bir satır istiyorsanız, her satırın farklı bir sayı olmasını istersiniz. Bu durumda, row_number kullanın. Bu küçük-önemli farktan başka, bu işlevler benzer ve aynı şekilde kullanılabilir.

+0

Harika yanıt! Teşekkürler – InkHeart

+0

Bu cevabın yanlış olduğunu düşünüyorum: yoğun sıra. yoğun sıralama hala iki sayıyı da üstte döndürür, bir sonraki sıra numaralarını atlamazdı. row_number, her iki sayıyı birlikte içermez. –

+0

@MikeS Teşekkürler! Haklısın ve yazdığım zaman aklımda nerede olduğumu bilmiyorum. 'rank' ve' dense_rank', belirtilen sıralamaya göre 'eşit' ise, her ikisi birden çok satır için aynı sayıyı döndürebilir. Metni düzelttim. – GolezTrol

5
select name 
from 
    (select name, count(1) 
     from table 
     group by name 
     order by count(1) desc) a 
where rownum = 1 
İlgili konular