【问题标题】:How do I find the rank position of a particular column [duplicate]如何找到特定列的排名位置[重复]
【发布时间】:2020-05-15 04:23:56
【问题描述】:

我有一张名为bank 的表。我想找到特定customer_number 的排名位置。例如my_id = 5 的排名位置为1,因为他是最富有的。那么my_id = 4 将是排名2

my_id | balance | customer_number
----------------|------------------
1     | 5       | 345345345
2     | 1       | 435456
3     | 45      | 345345
4     | 81      | 43543535
5     | 95      | 4566876
6     | 45      | 324624121

my_id = 6 的排名为3。并且my_id = 3 也将具有3 的等级,因为它们是重复的。然后4 的排名将被赋予my_id = 1

我还想在同一语句中选择balancemy_id,但我似乎也不能这样做。

我想要一种真正快速有效的方法。

select count(*) + 1, balance, my_id
from bank b
where b.balance > (select balance from bank where customer_number = 43543535);

select bank.*
from (select bank.*, rank() over (order by balance desc) as rnk
      from bank
     ) bank
where customer_number = 554113153538064391;

【问题讨论】:

  • 什么版本的 MySQL? MySQL 8 added rank
  • @Schwern 服务器版本:5.7.30
  • @Schwern 我编辑了答案,但出现语法错误
  • 我要找什么rank位置就是DENSE_RANK。

标签: mysql sql database select


【解决方案1】:

如果你只想要排名,那么这个查询应该没问题:

select count(*) + 1
from bank b
where b.balance > (select balance from bank where customer_number = 43543535);

为了提高性能,您需要在bank(customer_number)bank(balance) 上建立索引。

编辑:

有关所有信息,请使用JOIN

select count(*) + 1, bb.*
from bank b join
     (select balance from bank where customer_number = 43543535) bb
     on b.balance >= bb.balance;

MySQL 应该允许bb.*,即使这是一个聚合查询。正式地,你应该有group by bb.customer_number

【讨论】:

  • 如果我只想要排名,这个查询很好,但我想要他们的排名,my_id 和他们的balance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多