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
Другие вопросы по тегам