2011-10-09 42 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