考虑关系帐户(客户,余额),其中客户是主键,没有空值。
我想根据余额减少对客户进行排名。(拥有最大余额的客户将获得等级1。并没有打破关系,但会跳过等级:如果恰好有两个客户具有最大的余额,则他们各自将获得等级1和等级2。)
为什么以下查询从不打印排名为1的客户?
select A.customer, 1+count(B.customer)
from account A, account B
where A.balance < B.balance
group by A.customer
让我们尝试这个例子
排名不跳过等级
set @number:=0;
set @balance:=0;
select customer, balance, rank
from (
select
*,
@number:=if(@balance=balance, @number, @number+1) as rank,
@balance:=balance
from account
order by balance
) as rankeddata;
结果
customer balance rank
S 300 1
Q 400 2
R 400 2
P 500 3
要显示从500-> 300的排名,只需将更ORDER BY balance
改为ORDER BY balance DESC
如果多行具有相同的等级,则跳过等级
如果您希望跳过分配的排名,则可以对查询进行一些调整,例如SQL Fiddle。
set @number:=0;
set @balance:=0;
set @rank_reused:=0;
select customer, balance, rank
from (
select
*,
@number:=if(@balance=balance, @number, @number+1+@rank_reused) as rank,
@rank_reused:=if(@balance=balance, @rank_reused+1, 0) as reused,
@balance:=balance
from account
order by balance desc
) as rankeddata;
结果
customer balance rank
S 300 1
Q 400 2
R 400 2
P 500 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句