如何选择最常出现的值?

时间:2011-10-09 19:20:44

标签: sql oracle

我见过一些示例,其中查询按次数排序并占据最上面一行,但在这种情况下,可能会有多个“最常见”的值,因此我可能希望返回的不仅仅是单个结果。

在这种情况下,我想在用户表中找到最常出现的姓氏,这是我到目前为止所拥有的:

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

不幸的是,对于这个查询,我得到一个错误,我的max函数嵌套得太深了。

2 个答案:

答案 0 :(得分:25)

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。除了这个小但重要的区别之外,这些功能是相似的,可以以相同的方式使用。

答案 1 :(得分:6)

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