mysql - 我是否有效地获得用户的余额排名
问题描述
我是 SQL 新手,所以我想问一下。我有一张带有my_id
(主键)和balance
. 表中有数百万行数据。我想找到一my_id
排4
看台的排名。我所说的排名的意思是,如果整个表按余额排序(钱最多的人排名第一,钱最少的人排名最后)。我怎样才能有效地获得某人的排名。
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
因为它们是重复的
解决方案
您可以使用:
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()
如果那是您想要的逻辑(它们在处理重复项的方式上有所不同)。
推荐阅读
- sql - SQL - 使用两列向实体添加约束
- swift - 如何在进入区域后的某个时间安排推送通知?迅速
- javascript - 无法更改材质 UI 选择组件的填充
- c# - 如何在 C# 中将字符串转换为 HTTP 响应?
- swift - 此代码中 .enumerated() 和 .map() 的目的是什么?
- kotlin - Postman Mock API 与 Content-Type 标头的请求不匹配
- c++ - Memcpy 因访问冲突而失败 - Vulkan 复制到顶点缓冲区
- javascript - 我想要一个按钮根据时间在两个功能之间切换?
- c - 在二叉树中查找节点时出现内存错误
- java - 对于以自动化方式捕获应用程序外部连接的任何建议?