У меня есть таблица player_ratings
которая содержит два столбца: player_id
и rating
. Например:
| player_id | rating |
| 1 | 950 |
| 1 | 945 |
| 2 | 850 |
| 2 | 850 |
Я хочу вернуть список игроков с самым высоким рейтингом игроков.
Если в таблице есть повторяющиеся строки, верните самую верхнюю строку. Например, player_id
2 имеет две строки с одинаковым rating
поэтому верните строку 3 в таблицу.
в списке не должно быть дубликатов игроков. (см ожидаемый результат)
Я попытался следующий запрос, но он не удаляет дубликаты строк:
SELECT *
FROM player_ratings
INNER JOIN ( SELECT player_id, MAX(rating) as max_rating FROM player_ratings GROUP BY player_id) topratings
ON player_ratings.player_id = topratings.player_id
AND player_ratings.rating = topratings.max_rating
ORDER BY player_ratings.rating DESC ;
АКТУАЛЬНЫЙ ВЫХОД
| player_id | ranking |
| 1 | 950 |
| 2 | 850 |
| 2 | 850 |
ОЖИДАЕМЫЙ ВЫХОД
| player_id | ranking |
| 1 | 950 |
| 2 | 850 |
Поскольку это всего лишь два столбца, идентификатор игрока и рейтинг, вы можете просто агрегировать:
select player_id, max(rating)
from player_ratings
group by player_id
order by max(rating) desc;
Вы можете попробовать ниже -
SELECT player_id, MAX(rating) as max_rating FROM player_ratings
GROUP BY player_id
order by max_rating desc
Используйте GROUP BY
и MAX()
SELECT player_id, MAX(rating) as Rating
FROM player_ratings GROUP BY player_id
ORDER BY 2 DESC
Предполагая, что у вас есть уникальный идентификатор в player_ratings
, вы можете сделать:
select pr.*
from player_ratings pr
where pr.player_ratings_id in (select pr2.player_ratings_id
from player_ratings pr2
where pr2.player_id = pr.player_id
order by pr2.max_rating desc,
pr2.player_ratings_id asc
);