首页 > 解决方案 > 我是否有效地获得用户的余额排名

问题描述

我是 SQL 新手,所以我想问一下。我有一张带有my_id(主键)和balance. 表中有数百万行数据。我想找到一my_id4看台的排名。我所说的排名的意思是,如果整个表按余额排序(钱最多的人排名第一,钱最少的人排名最后)。我怎样才能有效地获得某人的排名。

my_id | balance
---------------
1     | 5
2     | 1
3     | 45
4     | 81
5     | 95
6     | 45

在这哪里my_id = 4会有排名,2因为他是第二富有的。我知道也许我可能也需要索引?

在哪里my_id = 6,就会有等级3。并且my_id = 3也会有排名,3因为它们是重复的

标签: mysqlsqldatabase

解决方案


您可以使用:

select count(*) + 1
from t
where t.balance > (select t2.balance from t where t2.my_id = 4);

(my_id, balance)使用和上的索引(balance),这可能是最快的方法:

create index idx_t_balance on t(balance);

my_id假设它是表中的主键,应该注意平衡。

更规范的解决方案使用窗口函数:

select t.*
from (select t.*, rank() over (order by balance desc) as rnk
      from t
     ) t
where my_id = 4;

注意:这两种用法都是rank()因为您在问题中指定了“排名”。有类似的逻辑使用dense_rank()或者row_number()如果那是您想要的逻辑(它们在处理重复项的方式上有所不同)。


推荐阅读