WITH t1 AS ( SELECT b.city, a.driver_id, ROUND(AVG(grade), 1) AS avg_grade FROM tb_get_car_order a LEFT JOIN tb_get_car_record b ON a.order_id = b.order_id WHERE start_time is not NULL GROUP BY b.city, a.driver_id ORDER BY b.city, a.driver_id ), t2 AS ( SELECT city, driver_id, avg_grade, rank() over ( PARTITION BY city ORDER BY avg_grade DESC ) AS rank_num FROM t1 ), t3 AS ( SELECT * FROM t2 WHERE rank_num = 1 ), t4 AS ( SELECT b.city, a.driver_id, DATE (a.order_time) AS dt, IFNULL (a.mileage, 0) AS mileage FROM tb_get_car_order a LEFT JOIN tb_get_car_record b ON a.order_id = b.order_id WHERE (b.city, a.driver_id) IN ( SELECT t3.city, t3.driver_id FROM t3 ) ), t5 AS ( SELECT city, driver_id, ROUND(count(driver_id) / count(DISTINCT dt), 1) as avg_order_num, ROUND(sum(mileage) / count(DISTINCT dt), 3) as avg_mileage FROM t4 GROUP BY city, driver_id ) SELECT t3.city, t3.driver_id, t3.avg_grade, t5.avg_order_num, t5.avg_mileage FROM t3 LEFT JOIN t5 ON t3.driver_id = t5.driver_id AND t3.city = t5.city ORDER BY t5.avg_order_num; # 这道题的关键在于,评分均值是成单的评分,而接单数则是包括取消单子!还有一个就是时间距离计算!