如何选择出现最频繁的值?

12

我看过一些示例,这些查询按计数排序并获取顶行,但在这种情况下可能会有多个“最常见”的值,因此我可能希望返回不止一个结果。

在这种情况下,我想找到用户表中出现最频繁的姓氏,以下是我迄今为止的代码:

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

很遗憾,使用这个查询时我收到一个错误,提示我的最大函数嵌套太深了。

2个回答

28
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。除此之外,这些函数类似并且可以以相同的方式使用。

我认为关于密集排名的答案是错误的。密集排名仍然会返回顶部的两个数字,只是不会跳过下一个排名数字。而row_number则不会将两个数字合并在一起。 - Mike S
@MikeS 谢谢!你说得对,我不知道当时写这个的时候脑子怎么了。如果按照指定的排序方式,rankdense_rank都可以为多行返回相同的数字,如果它们是“相等的”。我已经更正了文本。 - GolezTrol

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

1
这个答案缺少教育性的解释。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接