如何选择最常出现的值?

in *_*eps 10 sql oracle

我已经看到了一些示例,其中查询按计数排序并占据顶行,但在这种情况下可能存在多个"最常见"的值,因此我可能希望返回的不仅仅是单个结果.

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

select last_name from users group by last_name having max(count(*));
Run Code Online (Sandbox Code Playgroud)

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

Gol*_*rol 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
Run Code Online (Sandbox Code Playgroud)

使用分析功能rank.它将根据顺序分配编号count(*) desc.如果两个名称具有相同的计数,则它们将获得相同的排名,并跳过下一个数字(因此您可能会获得具有排名1,1和3的行).dense_rank如果两行具有相同的排名,则不会跳过下一个数字的替代方法(因此您将获得1,1,2),但如果您只想要排名为1的行,则没有太大区别.

如果只想要一行,则希望每行具有不同的数字.在那种情况下,使用row_number.除了这个小但重要的区别之外,这些功能类似,可以以相同的方式使用.


Arj*_*ash 6

select name
from
   (select name, count(1) 
      from table
      group by name
      order by count(1) desc) a
where rownum = 1
Run Code Online (Sandbox Code Playgroud)