我见过一些示例,其中查询按次数排序并占据最上面一行,但在这种情况下,可能会有多个“最常见”的值,因此我可能希望返回的不仅仅是单个结果。
在这种情况下,我想在用户表中找到最常出现的姓氏,这是我到目前为止所拥有的:
select last_name from users group by last_name having max(count(*));
不幸的是,对于这个查询,我得到一个错误,我的max函数嵌套得太深了。
答案 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