【问题标题】:How can I select championship winners in MySQL如何在 MySQL 中选择冠军得主
【发布时间】:2020-09-14 08:58:00
【问题描述】:

我正在做一些练习来准备我的考试,我偶然发现了一个关于 SQL 的问题。我有一个数据库,其中包含有关一级方程式车手、比赛和结果的信息。

  • 在“drivers”表中,有 driver_id、last_name、first_name、country 列。
  • 比赛表: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;

【问题讨论】:

标签: mysql sql


【解决方案1】:

首先加入ResultsRaces并聚合得到每个赛季车手的总分,并使用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

【讨论】:

    【解决方案2】:

    如果我没有误解你的问题,你应该试试这个:

    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
    

    【讨论】:

    • 您的查询仍然返回所有车手,我只想选择 2000、2006、2012 年的冠军。
    • 我会编辑我的答案,这样你就可以试试我给你的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多