1、理解题意:统计每个城市中评分最高的司机平均评分、日均接单量和日均行驶里程数 ①每个城市👉city👉tb_get_car_record ②评分最高👉grade👉tb_get_car_order ③司机平均评分&司机日均接单量&司机日均行驶里程数👉grade&order_time&mileage👉tb_get_car_order(注意:司机平均评分可直接用avg函数统计,而司机日均接单量&司机日均行驶里程数的 “分母” 计算的则是 “存在接单的天数” ,而非最早接单时间→最晚接单时间) 2、实操: ①创建一张临时表 with sum as( select t1.city, t2.driver_id, round(avg(t2.grade),1) as avg_grade, round(count(t2.order_time) / count(distinct date_format(t2.order_time,'%Y%m%d')),1) as avg_order_num, 【注意:由于分母为 “存在接单的天数”,因此要对天数按照 “日” 进行去重统计,从而计算出该天数】 round(sum(t2.mileage) / count(distinct date_format(t2.order_time,'%Y%m%d')),2) as avg_mileage, 【注意:由于里程数是存在具体数值的,因此分子的mileage要按 “司机” 进行分类汇总计算】 rank() over(partition by city order by round(avg(t2.grade),1) desc) as city_rank 【注意:此处排名是按照city进行分组,然后再在city中按照grade进行倒序排序,从而获得每个city的grade排名,进而支持下一步筛选出 “每个城市中评分最高的司机”】 from tb_get_car_record as t1 left join tb_get_car_order as t2 on t1.order_id = t2.order_id group by 1,2 ) select city,driver_id,avg_grade,avg_order_num,avg_mileage from sum where city_rank = 1 【满足条件:每个城市中评分最高的司机】 order by avg_order_num