Я собираюсь предположить, что ранг - это ранг в каждом отдельном классе.И тот, у которого самое короткое время, имеет самый высокий рейтинг.
Принимая следующие данные:
create table players (time float,
class char(2),
name char(10),
id char(2));
insert into players values (2.0, 'V1', 'George', 1),
(3.0, 'V1', 'Bill', 2),
(1.0, 'V2', 'Chris', 3),
(3.0, 'V5', 'Heini', 4);
Тогда следующий sql дает рейтинг по наименьшему времени в каждом классе:
select a1.id,
a1.name,
a1.time,
a1.class,
(select count(*)
from players a2
where a2.class = a1.class
and a2.time <= a1.time) as rank
from players a1
order by a1.class,
a1.time asc,
rank desc;
Это дает результат:
NAME TIME CLASS RANK
George 2.0 V1 1
Bill 3.0 V1 2
Chris 1.0 V2 1
Heini 3.0 V5 1
Помещая второе соединение в подзапрос, вы вычисляете ранг для каждой строки относительно других членов в том же классе.
Меня смущает, что у Хейни в вашем примере должно быть rank = 3, поскольку он единственный член класса = 'V5', поэтому я предполагаю, что это опечатка и должно быть 1.
Это тот результат, который вы ищете?
- РЕДАКТИРОВАТЬ
Если вы хотите, чтобы два человека, которые связывают 1-й, были # 1, а затемследующий номер # 3, затем измените его на:
select a1.id,
a1.name,
a1.time,
a1.class,
(select count(*) + 1
from players a2
where a2.class = a1.class
and a2.time < a1.time) as rank
from players a1
order by a1.class,
a1.time asc,
rank desc;
Сравнение времени теперь является <, а не <=, что исключает подсчет соответствующей строки в count (*), ивместо этого добавьте 1 обратно в счетчик.Два, у которых самое низкое время, будут иметь 0, которые меньше, чем время + 1 = ранг 1. Третий будет иметь 2, которые находятся впереди в рейтинге + 1, что делает их рангом 3. </p>