如何获取每年的点名和最大总和值?
How to get the name and maximum sum values of points for each year?
到目前为止,这是我的代码。它在 T-SQL.
但是,它只选择每年有最大值的项目,而不是总分。
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
这就是 sub 的样子
driver_name
year
race_points
a
2011
1
a
2011
1
b
2011
2
b
2011
2
c
2012
3
c
2012
3
d
2012
4
d
2012
4
我正在尝试让它看起来像这样
driver_name
year
max_points
b
2011
4
d
2012
8
我目前得到的是这个
driver_name
year
max_points
b
2011
2
d
2012
4
任何帮助将不胜感激。
您想要使用 window 函数进行聚合:
WITH cte as (
SELECT CONCAT(forename, ' ', surname) AS driver_name,
year, SUM(points) as race_points,
RANK() OVER (PARTITION BY year ORDER BY SUM(points) DESC) as seqnum
FROM results r JOIN
constructors c
ON r.constructorId = c.constructorId JOIN
drivers d
ON r.driverId = d.driverId JOIN
races rc
ON r.raceId = rc.raceId
GROUP BY CONCAT(forename, ' ', surname), year
)
SELECT *
FROM cte
WHERE seqnum = 1;
到目前为止,这是我的代码。它在 T-SQL.
但是,它只选择每年有最大值的项目,而不是总分。
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
这就是 sub 的样子
driver_name | year | race_points |
---|---|---|
a | 2011 | 1 |
a | 2011 | 1 |
b | 2011 | 2 |
b | 2011 | 2 |
c | 2012 | 3 |
c | 2012 | 3 |
d | 2012 | 4 |
d | 2012 | 4 |
我正在尝试让它看起来像这样
driver_name | year | max_points |
---|---|---|
b | 2011 | 4 |
d | 2012 | 8 |
我目前得到的是这个
driver_name | year | max_points |
---|---|---|
b | 2011 | 2 |
d | 2012 | 4 |
任何帮助将不胜感激。
您想要使用 window 函数进行聚合:
WITH cte as (
SELECT CONCAT(forename, ' ', surname) AS driver_name,
year, SUM(points) as race_points,
RANK() OVER (PARTITION BY year ORDER BY SUM(points) DESC) as seqnum
FROM results r JOIN
constructors c
ON r.constructorId = c.constructorId JOIN
drivers d
ON r.driverId = d.driverId JOIN
races rc
ON r.raceId = rc.raceId
GROUP BY CONCAT(forename, ' ', surname), year
)
SELECT *
FROM cte
WHERE seqnum = 1;