2

我正在尝试使用 MySQL 中的变量来了解密集排名。

我创建了一个像这样的表:

create table scores (id int,score float);

像这样插入值:

insert into scores values(1,3.50);
insert into scores values(2,3.65);
insert into scores values(3,4.00);
insert into scores values(4,3.85);
insert into scores values(5,4.00);
insert into scores values(6,3.65);

我写的查询使用这样的分数对表进行排名:

set @rank=0;
set@score='';
select score,
   (@rank := if(@score = score, 
                @rank, 
                if(@score := score,    
                   @rank+1, 
                   @rank                    
                  )
               )                  
   ) as rank
from scores  
order by score desc;

当我按分数 desc 运行查询“无”顺序时,输出是这样的:

score   rank 
3.5     1
3.65    2
4       3
3.85    4
4       5
3.65    6

当我按分数 desc 运行查询“with” order 时,我得到了输出,它是这样的:

score   rank
4       1
4       1
3.85    2
3.65    3
3.65    3
3.5     4

使用下面的代码段时内部会发生什么?

select score,
   (@rank := if(@score = score, 
                @rank, 
                if(@score := score,    
                   @rank+1, 
                   @rank                    
                  )
               )                  
   ) as rank
from scores 
4

1 回答 1

0

您的排名算法基本上只是将每一行的分数与前一行的分数或“”(第一行)进行比较。如果分数相同,则返回相同的排名,如果分数改变,则将排名增加一。

编辑

顺便说一句,它在对结果集进行排序后执行此操作。

于 2016-10-10T13:16:28.117 回答