Как выбрать победителей чемпионата в MySQL - PullRequest
0 голосов
/ 27 мая 2020

Я делаю пару упражнений, готовясь к экзаменам, и в одном я наткнулся на проблему, касающуюся SQL. У меня есть база данных с информацией о гонщиках, гонках и результатах Формулы 1.

  • В таблице «драйверы» есть столбцы driver_id, last_name, first_name, country.
  • Гонки table: race_id, season, grand_prix.
  • Таблица результатов: driver_id, points, race_id.

Я пытаюсь выбрать имена и фамилии победителей чемпионата 2000, 2006 годов, 2012 г., а также сумма очков за годы, в которых они выиграли. Я выполнил следующий запрос, который дает мне сумму баллов для каждого водителя за каждый год, но я не знаю, как получить только лучшие за каждый год.

SELECT season, first_name, last_name, SUM(points)
FROM (drivers JOIN results ON drivers.driver_id = results.driver_id)
JOIN races ON races.race_id = results.race_id
WHERE season IN(2000, 2006, 2012)
GROUP BY season, first_name, last_name;

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Сначала присоединитесь к Results к Races и суммируйте, чтобы получить общее количество очков пилотов за каждый сезон, а с помощью оконной функции ROW_NUMBER() получите 1 лучшего пилота. Затем присоединитесь к Drivers, чтобы получить имя драйвера:

SELECT g.season, d.last_name, d.first_name, g.points 
FROM (
  SELECT r.season, t.driver_id, SUM(t.points) points,
    ROW_NUMBER() OVER (PARTITION BY r.season ORDER BY SUM(t.points) DESC) rn 
  FROM Results t INNER JOIN Races r
  ON t.race_id = r.race_id
  WHERE r.season IN (2000, 2006, 2012)
  GROUP BY r.season, t.driver_id
) g INNER JOIN Drivers d
ON d.driver_id = g.driver_id AND g.rn = 1
0 голосов
/ 27 мая 2020

Если я правильно понял ваш вопрос, попробуйте следующее:

SELECT t.season, t.first_name, t.last_name, t.points
FROM    (
        SELECT  seasons
        FROM (drivers JOIN results ON drivers.driver_id = results.driver_id)
        JOIN races ON races.race_id = results.race_id
        ) a
CROSS APPLY
        (
        SELECT b.season, b.first_name, b.last_name, SUM(c.points) AS points
        FROM (drivers b JOIN results c ON drivers.driver_id = results.driver_id) 
        JOIN races ON races.race_id = results.race_id
        WHERE season IN(2000, 2006, 2012) AND a.seasons = b.season
        ORDER BY points DESC
        LIMIT 1
        ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...