# 求每个城市中评分最高的司机的三个指标
# 评分是指平均分

# 按城市分组求司机的评分均值,取最大值对应的司机
# 针对这些司机求平均评分、日均接单量和日均行驶里程数
# 未完成的接单也算作接单数;
# 只有接单成功的次数,才用于计算平均评分

# 临时表,用于查询每个城市的每个司机的聚合信息
WITH temp_0 AS(
	# 查询城市、司机id、接单成功的总订单数、平均评分、开窗函数求每个城市的最大平均评分、跑单的天数(要去重)、订单总数(不管接没接成)、里程总数
    SELECT city, driver_id, COUNT(fare) order_grade, ROUND(SUM(grade)/COUNT(fare), 1) avg_grade, MAX(ROUND(SUM(grade)/COUNT(fare), 1)) OVER(PARTITION BY city) max_avg_grade, COUNT(DISTINCT DATE(finish_time)) dt, COUNT(*) order_cnt, SUM(mileage) mileage_all
    FROM tb_get_car_record a
    JOIN tb_get_car_order b USING(order_id)
    GROUP BY city, driver_id
    )

# 主查询,查询目标信息
SELECT city, driver_id, avg_grade, ROUND(order_cnt / dt, 1) avg_order_num, ROUND(mileage_all / dt, 3) avg_mileage
FROM temp_0
# 使用临时表,找到满足平均评分为每个城市最大值的司机,这样就算一个城市有很多司机都是最大值,也能输出
WHERE driver_id IN (
    SELECT driver_id
    FROM temp_0
    WHERE avg_grade = max_avg_grade
    )
ORDER BY avg_order_num

思路:

1.一个临时表,先求每个城市的每个司机的聚合信息

2.计算字段求最终信息,并且使用临时表求每个城市符合要求的司机

其实是先求指定id,再根据id求其信息的增强版