0

This is my code so far It's in T-SQL.

I'm stuck at adding the driver_name column. What kind of aggregation am I supposed use?

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;

This is how sub looks like

driver_name year race_points
a 2010 2
a 2011 3
b 2011 4
b 2012 3
c 2012 4

I'm trying to make it look lie this

driver_name year max_points
a 2010 2
b 2011 4
c 2012 4

Any help would be really appreciated.

1 Answers1

0

With row_number() you can give your rows numbers according on how you partition the numbers. If you sort that accordingly you can select row number 1 from every group.

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
juergen d
  • 201,996
  • 37
  • 293
  • 362