我已经看到了一些示例,其中查询按计数排序并占据顶行,但在这种情况下可能存在多个"最常见"的值,因此我可能希望返回的不仅仅是单个结果.
在这种情况下,我想在用户表中找到最常出现的姓氏,这是我到目前为止所拥有的:
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
.除了这个小但重要的区别之外,这些功能类似,可以以相同的方式使用.
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)