我看过一些示例,这些查询按计数排序并获取顶行,但在这种情况下可能会有多个“最常见”的值,因此我可能希望返回不止一个结果。
在这种情况下,我想找到用户表中出现最频繁的姓氏,以下是我迄今为止的代码:
select last_name from users group by last_name having max(count(*));
很遗憾,使用这个查询时我收到一个错误,提示我的最大函数嵌套太深了。
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
。除此之外,这些函数类似并且可以以相同的方式使用。select name
from
(select name, count(1)
from table
group by name
order by count(1) desc) a
where rownum = 1
rank
和dense_rank
都可以为多行返回相同的数字,如果它们是“相等的”。我已经更正了文本。 - GolezTrol