sql-группировать по запросу
Я делаю свой проект SQL в эти дни, и мне нужна помощь.
У меня есть таблица с названием "игроки" и другая таблица с названием "статистика".
Хочу получить лучшего игрока для каждой роли.
Я выполнил этот запрос, и я получил только роль и оценку.
Я хочу получить имя и фамилию этого игрока.
Что я должен добавить к этому запросу, чтобы я получил его
select role, max(grade)
from players
join statistics
on players.player_id=statistics.player_id
group by role
2 ответа
Вы можете сделать это, используя общее табличное выражение и оконную функцию:
WITH Ranks AS (
SELECT first_name, last_name, role, grade,
ROW_NUMBER() OVER (PARTITION BY role ORDER BY grade DESC) AS rank
FROM players
join statistics on(
players.player_id = statistics.player_id
)
)
SELECT first_name, last_name, role, grade
FROM Ranks
WHERE rank = 1
Это необходимо сделать, потому что если вы просто добавите first_name
а также last_name
к SELECT
пункт, вы получите ошибку, и если вы добавите их в свой GROUP BY
Кроме того, вы получите по одной строке на игрока, а это не то, что вам нужно.
Пояснительное редактирование
Общее табличное выражение
WITH Ranks AS ( /*query*/ )
бит похож на подзапрос; это запрос, результаты которого используются в основном запросе, который следует позже. Здесь мы берем всех игроков, и их ранг в их роли.
Вы можете прочитать больше о распространенных табличных выражениях (CTE) здесь.
Оконная функция
ROW_NUMBER() OVER (PARTITION BY role ORDER BY grade DESC)
бит определяет новый столбец в запросе. Это говорит:
Возьмите набор результатов и разбейте его на разделы, которые имеют одинаковый role
значение. Тогда порядок по значению grade
по убыванию. Наконец, присвойте номер строки в каждом разделе с уже установленным порядком.
Вы можете прочитать больше о оконных функциях здесь.
Похоже, вам просто нужно добавить к выбранной части вашего запроса?
select
first_name, -- Column name guessed as you haven't shared your table structure with us
last_name,
role,
max(grade)
from
players
join statistics on(
players.player_id = statistics.player_id
)
group by
first_name,
last_name,
role