WITH a AS(SELECT
city,
driver_id,
ROUND(SUM(grade)/COUNT(order_id), 1) AS avg_grade
FROM
tb_get_car_record r
JOIN
tb_get_car_order o USING(order_id)
WHERE
grade is not null
GROUP BY
city, driver_id
ORDER BY
driver_id),
b AS (
SELECT
city, driver_id, RANK() OVER (PARTITION BY city ORDER BY avg_grade DESC) AS ranking
FROM
a
),
c AS (SELECT city, driver_id FROM b WHERE ranking = 1)
SELECT
city,
driver_id,
ROUND(AVG(grade), 1) AS avg_grade,
ROUND(COUNT(order_id)/COUNT(DISTINCT DATE(order_time)), 1) AS avg_order_num,
SUM(mileage)/COUNT(DISTINCT DATE(order_time)) AS avg_mileage
FROM
tb_get_car_record r
JOIN
tb_get_car_order o USING(order_id)
WHERE
(city, driver_id) in (SELECT * FROM c)
GROUP BY
driver_id, city
ORDER BY
avg_order_num