如何获取每年的点名和最大值? (SQL)
How to get the name and maximum values of points for each year? (SQL)
到目前为止这是我的代码它在 T-SQL.
我无法添加 driver_name 列。我应该使用哪种聚合?
SELECT MAX(race_points) max_points, year, driver_name
FROM
(SELECT
CONCAT(forename,' ',surname) AS driver_name,
year,
(CONVERT(FLOAT,points)) AS race_points
FROM
results AS r
INNER JOIN constructors AS c
ON r.constructorId = c.constructorId
INNER JOIN drivers AS d
ON r.driverId = d.driverId
INNER JOIN races AS rc
ON r.raceId = rc.raceId) AS sub
GROUP BY year;
这就是 sub 的样子
driver_name
year
race_points
a
2010
2
a
2011
3
b
2011
4
b
2012
3
c
2012
4
我想让它看起来像是在撒谎
driver_name
year
max_points
a
2010
2
b
2011
4
c
2012
4
任何帮助将不胜感激。
使用 row_number()
,您可以根据对数字进行分区的方式来指定行号。如果相应地对其进行排序,则可以 select 每组中的第 1 行。
WITH cte as
(
SELECT
CONCAT(forename,' ',surname) AS driver_name,
year,
(CONVERT(FLOAT,points)) AS race_points,
row_number() over (partition by year order by (CONVERT(FLOAT,points)) desc) as rn
FROM
results AS r
INNER JOIN constructors AS c ON r.constructorId = c.constructorId
INNER JOIN drivers AS d ON r.driverId = d.driverId
INNER JOIN races AS rc ON r.raceId = rc.raceId
)
SELECT * FROM cte
WHERE rn = 1
到目前为止这是我的代码它在 T-SQL.
我无法添加 driver_name 列。我应该使用哪种聚合?
SELECT MAX(race_points) max_points, year, driver_name
FROM
(SELECT
CONCAT(forename,' ',surname) AS driver_name,
year,
(CONVERT(FLOAT,points)) AS race_points
FROM
results AS r
INNER JOIN constructors AS c
ON r.constructorId = c.constructorId
INNER JOIN drivers AS d
ON r.driverId = d.driverId
INNER JOIN races AS rc
ON r.raceId = rc.raceId) AS sub
GROUP BY year;
这就是 sub 的样子
driver_name | year | race_points |
---|---|---|
a | 2010 | 2 |
a | 2011 | 3 |
b | 2011 | 4 |
b | 2012 | 3 |
c | 2012 | 4 |
我想让它看起来像是在撒谎
driver_name | year | max_points |
---|---|---|
a | 2010 | 2 |
b | 2011 | 4 |
c | 2012 | 4 |
任何帮助将不胜感激。
使用 row_number()
,您可以根据对数字进行分区的方式来指定行号。如果相应地对其进行排序,则可以 select 每组中的第 1 行。
WITH cte as
(
SELECT
CONCAT(forename,' ',surname) AS driver_name,
year,
(CONVERT(FLOAT,points)) AS race_points,
row_number() over (partition by year order by (CONVERT(FLOAT,points)) desc) as rn
FROM
results AS r
INNER JOIN constructors AS c ON r.constructorId = c.constructorId
INNER JOIN drivers AS d ON r.driverId = d.driverId
INNER JOIN races AS rc ON r.raceId = rc.raceId
)
SELECT * FROM cte
WHERE rn = 1