Это полностью рабочий пример, с этой таблицей выборки
create table tpoints (id int, name varchar(10), points int);
insert tpoints values
(1 ,'joe', 100),
(2 ,'bob', 95 ),
(3 ,'max', 95 ),
(4 ,'leo', 90 );
для MySQL запросы
select t.*, sq.`rank`
from
(
select
points,
@rank := case when @g = points then @rank else @rn + (c-1)/2.0 end `rank`,
@g := points,
@rn := @rn + c
from
(select @g:=null, @rn:=1) g,
(select points, count(*) c
from tpoints
group by points
order by points asc) p
) sq inner join tpoints t on t.points = sq.points
order by t.points asc;
Это также имеет преимущество выполнения очень хорошо по сравнению с выполнением коррелированного креста (сам) присоединиться.
- 1x проход через tpoints агрегировать в группы
- расчет ранга со связями
- 1x присоединиться к столу, чтобы положить ряды против записей.
это действительно выглядит хорошим другом! – voldomazta
отличный - если он работает, отметьте рядом с ответом, чтобы принять его. спасибо – RichardTheKiwi
Это вернет x.5 для любого количества дубликатов «x». Если есть три дубликата, например «9», все они будут «9,5», а не «9.333 ...». Также может быть сделано без самоподключения. –