题解 | #每个城市中评分最高的司机信息#
每个城市中评分最高的司机信息
https://www.nowcoder.com/practice/dcc4adafd0fe41b5b2fc03ad6a4ac686
解题思路:
本题最主要的点应该是找出每个城市中平均评分最高的司机,因为城市和司机信息分表在两个表上,所以第一步需要先把两个表关联起来,可以使用order_id字段来关联。
关联之后,可以计算出每个城市各位司机的平均评分;
再进一步对平均评分进行排名,这里使用rank()over(),注意要按city分区、按平均评分降序来进行排名;
取排名为1的司机driver_id,因为rank()over()相同的值排名相同,所以取排名为1的可以把相同评分的司机都取出来。关联上前面关联好的driver_order_info,就可以再计算出另外两个指标了,注意不能直接使用avg(),因为日期需要distinct。
答案示例:
WITH driver_order_info AS#关联两表 (SELECT city,driver_id,order_id,date(order_time)order_date,mileage,grade FROM tb_get_car_record LEFT JOIN tb_get_car_order USING(order_id) WHERE order_id is not null), driver_grade_avg AS#计算每个司机的平均评分 (SELECT city,driver_id,round(avg(grade),1)avg_grade FROM driver_order_info GROUP BY city,driver_id), driver_grade_avg_rank AS#对司机的平均评分进行排序 (SELECT *,rank()over(partition by city order by avg_grade DESC)grade_rank FROM driver_grade_avg) SELECT city,driver_id,avg_grade, round(count(order_id)/count(distinct order_date),1)avg_order_num, round(sum(mileage)/count(distinct order_date),3)avg_mileage FROM driver_order_info RIGHT JOIN (select * from driver_grade_avg_rank where grade_rank=1)driver_max USING(city,driver_id) GROUP BY city,driver_id ORDER BY avg_order_num;
运行结果:
欢迎提优化建议~