我已经看到了一些例子,其中查询按count排序并取得最上面一行,但在这种情况下,可能有多个“最常见”的值,所以我可能想要返回的不仅仅是单个结果。如何选择最常出现的值?
在这种情况下,我想找到一个用户表中出现频率最高的姓氏,这是我到目前为止有:
select last_name from users group by last_name having max(count(*));
不幸的是与此查询我得到我的最大函数嵌套错误太深了。
我已经看到了一些例子,其中查询按count排序并取得最上面一行,但在这种情况下,可能有多个“最常见”的值,所以我可能想要返回的不仅仅是单个结果。如何选择最常出现的值?
在这种情况下,我想找到一个用户表中出现频率最高的姓氏,这是我到目前为止有:
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
很好的回答!谢谢 – InkHeart
我相信这个答案是不正确的重新:密集的排名。密集排名仍然会返回顶部的两个数字,它不会跳过下一个排名数字。 row_number不包括两个数字在一起。 –
@MikeS谢谢!你说得对,我不知道自己在写什么的时候在想什么。如果根据指定的排序,“rank”和“dense_rank”都可以为多行返回相同的数字。我已更正了文字。 – GolezTrol