2011-10-09 38 views
9

我已經看到了一些例子,其中查詢按count排序並取得最上面一行,但在這種情況下,可能有多個「最常見」的值,所以我可能想要返回的不僅僅是單個結果。如何選擇最常出現的值?

在這種情況下,我想找到一個用戶表中出現頻率最高的姓氏,這是我到目前爲止有:

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

不幸的是與此查詢我得到我的最大函數嵌套錯誤太深了。

回答

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。它將根據count(*) desc的順序分配一個編號。如果兩個名稱的計數相同,則它們的排名相同,並且下一個數字被跳過(因此您可能會得到排名爲1,1和3的行)。 dense_rank是一種替代方法,如果兩行得到相同的排名,則不會跳過下一個數字(所以您會得到1,1,2),但是如果您只需要排名爲1的行,則沒有多少區別。

如果你只想要一行,你希望每一行都有不同的數字。在這種情況下,請使用row_number。除了這個小而重要的區別之外,這些功能是相似的,並且可以以相同的方式使用。

+0

很好的回答!謝謝 – InkHeart

+0

我相信這個答案是不正確的重新:密集的排名。密集排名仍然會返回頂部的兩個數字,它不會跳過下一個排名數字。 row_number不包括兩個數字在一起。 –

+0

@MikeS謝謝!你說得對,我不知道自己在寫什麼的時候在想什麼。如果根據指定的排序,「rank」和「dense_rank」都可以爲多行返回相同的數字。我已更正了文字。 – GolezTrol

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