首页 > 试题广场 >

每个城市中评分最高的司机信息

[编程题]每个城市中评分最高的司机信息
  • 热度指数:42669 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

用户打车记录表tb_get_car_record

id uid city event_time end_time order_id
1 101 北京 2021-10-01 07:00:00 2021-10-01 07:02:00
NULL
2 102 北京
2021-10-01 09:00:30
2021-10-01 09:01:00
9001
3 101 北京
2021-10-01 08:28:10
2021-10-01 08:30:00
9002
4 103 北京
2021-10-02 07:59:00
2021-10-02 08:01:00
9003
5 104 北京
2021-10-03 07:59:20
2021-10-03 08:01:00
9004
6 105 北京
2021-10-01 08:00:00
2021-10-01 08:02:10
9005
7 106 北京
2021-10-01 17:58:00
2021-10-01 18:01:00
9006
8 107 北京
2021-10-02 11:00:00
2021-10-02 11:01:00
9007
9 108 北京
2021-10-02 21:00:00
2021-10-02 21:01:00
9008
10 109 北京
2021-10-08 18:00:00
2021-10-08 18:01:00
9009
(uid-用户ID, city-城市, event_time-打车时间, end_time-打车结束时间, order_id-订单号)


打车订单表tb_get_car_order

id order_id uid driver_id order_time start_time finish_time mileage fare grade
1 9002 101 202 2021-10-01 08:30:00
NULL
2021-10-01 08:31:00
NULL
NULL
NULL
2 9001 102 202 2021-10-01 09:01:00
2021-10-01 09:06:00
2021-10-01 09:31:00
10 41.5 5
3 9003
103 202 2021-10-02 08:01:00
2021-10-02 08:15:00
2021-10-02 08:31:00
11 41.5 4
4 9004
104 202 2021-10-03 08:01:00
2021-10-03 08:13:00
2021-10-03 08:31:00
7.5 22 4
5 9005
105 203 2021-10-01 08:02:10
NULL
2021-10-01 08:31:00
NULL NULL NULL
6 9006
106 203 2021-10-01 18:01:00
2021-10-01 18:09:00
2021-10-01 18:31:00
8 25.5 5
7 9007
107 203 2021-10-02 11:01:00
2021-10-02 11:07:00
2021-10-02 11:31:00
9.9 30 5
8 9008
108 203 2021-10-02 21:01:00
2021-10-02 21:10:00
2021-10-02 21:31:00
13.2 38 4
9 9009 109 203 2021-10-08 18:01:00 2021-10-08 18:11:50
2021-10-08 18:51:00
13 40 5
(order_id-订单号, uid-用户ID, driver_id-司机ID, order_time-接单时间, start_time-开始计费的上车时间,  finish_time-订单完成时间, mileage-行驶里程数, fare-费用, grade-评分)


场景逻辑说明
  • 用户提交打车请求后,在用户打车记录表生成一条打车记录,order_id-订单号设为null

  • 当有司机接单时,在打车订单表生成一条订单,填充order_time-接单时间及其左边的字段,start_time-开始计费的上车时间及其右边的字段全部为null,并把order_id-订单号order_time-接单时间end_time-打车结束时间)写入打车记录表;若一直无司机接单,超时或中途用户主动取消打车,则记录end_time-打车结束时间

  • 若乘客上车前,乘客或司机点击取消订单,会将打车订单表对应订单的finish_time-订单完成时间填充为取消时间,其余字段设为null

  • 当司机接上乘客时,填充订单表中该start_time-开始计费的上车时间
  • 当订单完成时填充订单完成时间、里程数、费用;评分设为null,在用户给司机打1~5星评价后填充。

问题:请统计每个城市中评分最高的司机平均评分、日均接单量和日均行驶里程数。

:有多个司机评分并列最高时,都输出。
平均评分和日均接单量保留1位小数,
日均行驶里程数保留3位小数,按日均接单数升序排序。

2285068
示例数据的输出结果如下
city driver_id avg_grade avg_order_num avg_mileage
北京 203 4.8 1.7 14.700
解释:
示例数据中,在北京市,共有2个司机接单,202的平均评分为4.3,203的平均评分为4.8,因此北京的最高评分的司机为203;203的共在3天里接单过,一共接单5次(包含1次接单后未完成),因此日均接单数为1.7;总行驶里程数为44.1,因此日均行驶里程数为14.700
示例1

输入

DROP TABLE IF EXISTS tb_get_car_record,tb_get_car_order;
CREATE TABLE tb_get_car_record (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid INT NOT NULL COMMENT '用户ID',
    city VARCHAR(10) NOT NULL COMMENT '城市',
    event_time datetime COMMENT '打车时间',
    end_time datetime COMMENT '打车结束时间',
    order_id INT COMMENT '订单号'
) CHARACTER SET utf8 COLLATE utf8_bin;

CREATE TABLE tb_get_car_order (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    order_id INT NOT NULL COMMENT '订单号',
    uid INT NOT NULL COMMENT '用户ID',
    driver_id INT NOT NULL COMMENT '司机ID',
    order_time datetime COMMENT '接单时间',
    start_time datetime COMMENT '开始计费的上车时间',
    finish_time datetime COMMENT '订单结束时间',
    mileage FLOAT COMMENT '行驶里程数',
    fare FLOAT COMMENT '费用',
    grade TINYINT COMMENT '评分'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_get_car_record(uid, city, event_time, end_time, order_id) VALUES
 (101, '北京', '2021-10-01 07:00:00', '2021-10-01 07:02:00', null),
 (102, '北京', '2021-10-01 09:00:30', '2021-10-01 09:01:00', 9001),
 (101, '北京', '2021-10-01 08:28:10', '2021-10-01 08:30:00', 9002),
 (103, '北京', '2021-10-02 07:59:00', '2021-10-02 08:01:00', 9003),
 (104, '北京', '2021-10-03 07:59:20', '2021-10-03 08:01:00', 9004),
 (105, '北京', '2021-10-01 08:00:00', '2021-10-01 08:02:10', 9005),
 (106, '北京', '2021-10-01 17:58:00', '2021-10-01 18:01:00', 9006),
 (107, '北京', '2021-10-02 11:00:00', '2021-10-02 11:01:00', 9007),
 (108, '北京', '2021-10-02 21:00:00', '2021-10-02 21:01:00', 9008),
 (109, '北京', '2021-10-08 18:00:00', '2021-10-08 18:01:00', 9009);

INSERT INTO tb_get_car_order(order_id, uid, driver_id, order_time, start_time, finish_time, mileage, fare, grade) VALUES
 (9002, 101, 202, '2021-10-01 08:30:00', null, '2021-10-01 08:31:00', null, null, null),
 (9001, 102, 202, '2021-10-01 09:01:00', '2021-10-01 09:06:00', '2021-10-01 09:31:00', 10.0, 41.5, 5),
 (9003, 103, 202, '2021-10-02 08:01:00', '2021-10-02 08:15:00', '2021-10-02 08:31:00', 11.0, 41.5, 4),
 (9004, 104, 202, '2021-10-03 08:01:00', '2021-10-03 08:13:00', '2021-10-03 08:31:00', 7.5, 22, 4),
 (9005, 105, 203, '2021-10-01 08:02:10', null, '2021-10-01 08:31:00', null, null, null),
 (9006, 106, 203, '2021-10-01 18:01:00', '2021-10-01 18:09:00', '2021-10-01 18:31:00', 8.0, 25.5, 5),
 (9007, 107, 203, '2021-10-02 11:01:00', '2021-10-02 11:07:00', '2021-10-02 11:31:00', 9.9, 30, 5),
 (9008, 108, 203, '2021-10-02 21:01:00', '2021-10-02 21:10:00', '2021-10-02 21:31:00', 13.2, 38, 4),
 (9009, 109, 203, '2021-10-08 18:01:00', '2021-10-08 18:11:50', '2021-10-08 18:51:00', 13, 40, 5);

输出

北京|203|4.8|1.7|14.700
with t as(
    SELECT
        city,
        driver_id,
        round(avg(grade),1) avg_grade,
        round(count(finish_time)/count(distinct date_format(finish_time,'%Y%m%d')),1) avg_order_num,
        sum(mileage)/count(distinct date_format(finish_time,'%Y%m%d')) avg_mileage,
        rank() over(partition by city order by round(avg(grade),1) desc) city_rank
    FROM tb_get_car_order co
    LEFT JOIN tb_get_car_record cr
    ON co.order_id=cr.order_id
    GROUP BY city,driver_id
)
select city,driver_id,avg_grade,avg_order_num,avg_mileage
from t
where city_rank=1
order by city desc,avg_mileage asc
;

发表于 2021-12-14 12:01:40 回复(0)
select city,driver_id,avg_grade,avg_order_num,avg_mileage from
(select r.city,o.driver_id,
round(avg(o.grade),1) avg_grade,
round(count(o.order_id)/(count(distinct date(order_time))),1) avg_order_num,
round(sum(o.mileage)/(count(distinct date(order_time))),3) avg_mileage,
dense_rank() over (partition by r.city order by round(avg(o.grade),1) desc) t_rank
from tb_get_car_order o 
inner join tb_get_car_record r on r.order_id=o.order_id
group by r.city,o.driver_id) as a
where t_rank = 1
order by avg_order_num
不管最后用户或者司机有没有取消订单,都是算接单的!
常规做法,感觉大家做得都一样哎,冲!
发表于 2021-12-05 15:48:40 回复(0)
with driver_info as(
    select tgcr.city,tgco.*
    from tb_get_car_order tgco
    join tb_get_car_record tgcr
    on  tgco.order_id=tgcr.order_id
)
,
ans_to_be_refined as(
select city,driver_id,
ROUND(avg(grade),1) as avg_grade,
ROUND(count(*)/count(distinct date_format(order_time,"%Y-%m-%d")),1) as avg_order_num,
ROUND(sum(mileage)/count(distinct date_format(order_time,"%Y-%m-%d")),3) as avg_mileage
from driver_info
group by city,driver_id
order by avg_order_num asc
)

select a.* from ans_to_be_refined  a
join (select city,max(avg_grade) as max_avg_grade from ans_to_be_refined group by city) t1
on t1.city=a.city  and t1.max_avg_grade=a.avg_grade

发表于 2023-03-17 19:10:14 回复(0)

【场景】:输出最大值并列

【分类】:嵌套子查询、rank() ... ranking = 1

分析思路

难点:

1.最大值并列时如何输出并列的司机信息:使用窗口函数,并列排序

(1)统计每个城市中司机的平均评分、日均接单量和日均行驶里程数

  • [使用]:分组查询

(2)对每个城市中司机按照平均评分降序排序

  • [使用]:窗口函数 rank() 和 dense_rank()都可以并列排序

(3)统计每个城市中评分最高的司机平均评分、日均接单量和日均行驶里程数。按日均接单数升序排序

并列排序之后取 rank = 1的数据,最后按照日均接单数升序排序

  • [条件]:where ranking = 1

  • [使用]:order by avg_order_num

求解代码

方法一

with子句

with
    main as(
        #统计每个城市中司机的平均评分、日均接单量和日均行驶里程数
        select
            city,
            driver_id,
            round(avg(grade),1) as grade_avg,
            round(count(distinct order_id)/count(distinct date(order_time)),1) as avg_order_num,
            round(sum(mileage)/count(distinct date(order_time)),3) as avg_mileage
        from tb_get_car_record
        join tb_get_car_order using(order_id)
        group by city,driver_id
    )
    ,main1 as(
        #对每个城市中司机按照平均评分降序排序
        select
            city,
            driver_id,
            grade_avg,
            avg_order_num,
            avg_mileage,
            rank() over (partition by city order by grade_avg desc) as ranking
        from main
    )

#统计每个城市中评分最高的司机平均评分、日均接单量和日均行驶里程数。按日均接单数升序排序
select
    city,
    driver_id,
    grade_avg,
    avg_order_num,
    avg_mileage
from main1
where ranking = 1
order by avg_order_num

方法二

from嵌套子查询

#统计每个城市中评分最高的司机平均评分、日均接单量和日均行驶里程数。按日均接单数升序排序
select
    city,
    driver_id,
    grade_avg,
    avg_order_num,
    avg_mileage
from(
    #对每个城市中司机按照平均评分降序排序
    select
        city,
        driver_id,
        grade_avg,
        avg_order_num,
        avg_mileage,
        rank() over (partition by city order by grade_avg desc) as ranking
    from(
        #统计每个城市中司机的平均评分、日均接单量和日均行驶里程数
        select
            city,
            driver_id,
            round(avg(grade),1) as grade_avg,
            round(count(distinct order_id)/count(distinct date(order_time)),1) as avg_order_num,
            round(sum(mileage)/count(distinct date(order_time)),3) as avg_mileage
        from tb_get_car_record
        join tb_get_car_order using(order_id)
        group by city,driver_id
    ) main
) main1
where ranking = 1
order by avg_order_num
发表于 2022-12-03 17:20:13 回复(0)
先建立基础表供查询
算出每个城市中的司机平均评分、日均接单量和日均行驶里程数
with temp as 
(
select
city,
driver_id,
round(avg(grade),1) as avg_grade,
round(count(order_time)/count(distinct date(order_time)),1) 
      as avg_order_num,
round(sum(mileage)/count(distinct date(order_time)),3) 
      as avg_mileage
from tb_get_car_order
join tb_get_car_record using(order_id)
group by city,driver_id
)
然后在此基础上。使用dense rank 排序(使用rank也可以)
选择序号为1的输出即可
select 
city,driver_id,avg_grade,avg_order_num,avg_mileage
from
(select
*,
dense_rank() over (partition by city order by avg_grade desc)
    as rk
from temp) t1
where rk =1
order by avg_order_num
完整代码如下
with temp as 
(
select
city,
driver_id,
round(avg(grade),1) as avg_grade,
round(count(order_time)/count(distinct date(order_time)),1) 
      as avg_order_num,
round(sum(mileage)/count(distinct date(order_time)),3) 
      as avg_mileage
from tb_get_car_order
join tb_get_car_record using(order_id)
group by city,driver_id
)

select 
city,driver_id,avg_grade,avg_order_num,avg_mileage
from
(select
*,
dense_rank() over (partition by city order by avg_grade desc)
    as rk
from temp) t1
where rk =1
order by avg_order_num
发表于 2022-05-20 16:46:38 回复(0)
select city, driver_id, avg_grade, avg_order_num, avg_mileage
from (
select city, driver_id, avg_grade, avg_order_num, avg_mileage, 
    dense_rank() over(partition by city order by avg_grade desc) as rnk
from (
select city, driver_id, 
    round(avg(grade), 1) as avg_grade, 
    round(count(a.order_id)/count(distinct(date(order_time))), 1) as avg_order_num, 
    round(sum(mileage)/count(distinct(date(order_time))), 3) as avg_mileage
from tb_get_car_order a left join tb_get_car_record b 
on a.order_id = b.order_id
group by city, driver_id
    ) t1
        ) t2
where rnk = 1
order by avg_order_num
原来窗口函数的order by后面可以有计算函数🤔
发表于 2022-04-07 23:34:59 回复(0)
select city,driver_id,avg_grade,cnt_order,cnt_mile
from 
    (select 
        b.city,a.driver_id
        ,round(avg(grade),1) as avg_grade
        ,round(count(a.order_id)/count(distinct substring(order_time,1,10)),1) as cnt_order
        ,round(sum(mileage)/count(distinct substring(order_time,1,10)),3) as cnt_mile
        ,dense_rank()over(partition by b.city order by avg(grade) desc) as rank2
    from tb_get_car_order a 
    left join tb_get_car_record b on a.order_id=b.order_id
    group by b.city,a.driver_id) t 
where rank2=1
order by cnt_order

发表于 2022-03-29 21:12:00 回复(1)
select city,driver_id,avg_grade,avg_order_num,avg_mileage
from(
select city,driver_id,
round(avg(grade),1) avg_grade,
round(count(order_id)/count(distinct date(order_time)),1) avg_order_num,
round(sum(mileage)/(count(distinct date(order_time))),3) avg_mileage,
dense_rank() over(partition by city order by  round(avg(grade),1) desc) rk
from tb_get_car_order inner join 
tb_get_car_record using (order_id)
group by city,driver_id) t1
where rk=1
order by avg_order_num 

发表于 2022-03-09 18:28:57 回复(0)
with A as (select a.city,b.driver_id,round(avg(b.grade),1) avg_grade,round(count(b.order_time)/count(distinct date(b.order_time)),1) avg_order_num,round(sum(b.mileage)/count(distinct date(b.order_time)),3) avg_mileage from tb_get_car_order b left join tb_get_car_record a using(order_id)
group by a.city,b.driver_id order by round(avg(b.grade),1) desc)
, B as ( select * ,dense_rank()over(partition by city order by avg_grade desc) dese_rank from A)
 select city,driver_id,avg_grade,avg_order_num,avg_mileage from B where dese_rank=1 order by avg_mileage;
发表于 2023-11-22 15:27:26 回复(0)
with t as (
    select
        city,
        driver_id,
        round(avg(grade),1) avg_grade,
        round(count(gco.order_id) / count(distinct date(order_time)),1) avg_order_num,
        round(sum(mileage) / count(distinct date(order_time)),3) avg_mileage,
        rank() over(partition by city order by avg(grade) desc) ranking
    from tb_get_car_record gcr
    join tb_get_car_order gco 
    on gcr.order_id = gco.order_id
    group by city,driver_id
)
select
    city,
    driver_id,
    avg_grade,
    avg_order_num,
    avg_mileage
from t 
where ranking = 1
order by avg_order_num;

发表于 2023-08-04 12:24:55 回复(0)
select
city,
driver_id,
round(avg_grade,1),
round(avg_order_num,1),
round(avg_mile_num,3)

from

(select r.city, o.driver_id, avg(grade) as avg_grade, 
count(o.order_id)/count(distinct date_format(order_time,"%Y%-%m-%d")) as avg_order_num,
sum(o.mileage)/count(distinct date_format(order_time,"%Y%-%m-%d")) as avg_mile_num,
rank()over(partition by city order by avg(grade) desc) as grade_rank

from tb_get_car_record as r join tb_get_car_order as o
on r.order_id = o.order_id


group by city, driver_id) as t 

where grade_rank = 1 #这个graderank因为是窗口函数搞出来的,不能直接套在里面那层用,必须放在外层
order by avg_order_num asc

发表于 2023-04-25 14:34:29 回复(1)
select city,driver_id,avg_grade,
       round(order_cnt/date_cnt,1) avg_order_num,
       round(sum_mileage/date_cnt,3) avg_mileage
from(
select *,rank() over(partition by city order by avg_grade desc) as rk
from(
select city,driver_id,round(avg(grade),1) avg_grade,
       count(distinct date_format(order_time,'%Y-%m-%d')) date_cnt,
       count(*) order_cnt,
       sum(mileage) sum_mileage
from tb_get_car_record t_rec,
     tb_get_car_order t_ord 
where t_rec.order_id=t_ord.order_id 
group by city,driver_id
)a
)b
where rk=1
order by avg_order_num

发表于 2023-03-15 17:24:03 回复(0)
select tb1.city,tb1.driver_id,round(avg_grade,1) as avg_grade,
round(count(tb2.order_time)/count(distinct date(tb2.order_time)),1) as avg_order_num,
round(sum(ifnull(tb2.mileage,0))/count(distinct date(tb2.order_time)),3) as avg_mileage
from
(
select city,driver_id,avg(grade) as avg_grade,
rank() over(partition by city order by avg(grade) desc) as ranking
from
(select city,order_id from tb_get_car_record) as cr
inner join tb_get_car_order as co 
on cr.order_id=co.order_id
where grade is not null
group by city,driver_id
) as tb1 #每个城市司机的平均分,并进行排序
inner join tb_get_car_order as tb2
on tb1.driver_id=tb2.driver_id
where ranking=1 #多个司机评分并列最高时,都输出
group by city,driver_id
order by avg_order_num;

发表于 2023-02-25 12:08:59 回复(0)
select city ,driver_id,a,b,c
from (select city,t2.driver_id,round(avg(grade),1) A,
round(count(order_time)/count(distinct date(order_time)),1) b,
round(sum(mileage)/count(distinct date(order_time)),3) c,
rank() over(partition by city order by 
                  round(count(order_time)/count(distinct date(order_time)),1) desc
                 ) rn
from tb_get_car_record t1
inner join tb_get_car_order t2
on t1.uid=t2.uid
and t1.order_id=t2.order_id
group by city,t2.driver_id)t
where rn=1

order by b

发表于 2022-01-07 18:36:28 回复(1)
复杂的思路:
1. 计算各个城市各个司机平均分排名
2. 筛选各个城市最高的司机id
3. 计算平均值
select city,driver_id
,round(avg(grade),1) avg_grade
,round(count(1)/count(distinct date(order_time)),1) avg_order_num 
,round(sum(mileage)/count(distinct date(order_time)),3) avg_mileage 
from tb_get_car_order t1
left join tb_get_car_record t2 on t1.order_id=t2.order_id
where (city,driver_id) in (
        select city,driver_id
        from(
            select city,driver_id,dense_rank()over(partition by city order by avg(grade) desc) t_count
            from tb_get_car_order t1
            left join tb_get_car_record t2 on t1.order_id=t2.order_id
            group by city,driver_id
        )t 
        where t_count=1
    )
group by driver_id
order by avg_order_num


发表于 2022-01-07 17:14:45 回复(1)
一种不用窗口函数的方法
with t1 as (select city, driver_id, round(avg(grade), 1) as avg_grade, round(count(order_time) / count(distinct date(order_time)), 1) as avg_order_num,
round(sum(mileage) / count(distinct date(order_time)), 3) as avg_mileage
from tb_get_car_order as d inner join tb_get_car_record as u using(order_id)
group by city, driver_id)

select * 
from t1
group by city, driver_id
having avg_grade in (select max(avg_grade) from t1 group by city)
order by avg_order_num

编辑于 2024-04-07 17:54:49 回复(0)
1.with……as 结构
with a as 
(
select
city 
,driver_id
,round(avg(grade),1) avg_grade
,round(count(date(order_time))/count(distinct date(order_time)),1) avg_order_num
,round(sum(mileage)/count(distinct date(order_time)),3) avg_mileage
,dense_rank()over(partition by city order by avg(grade) desc) rk
from tb_get_car_record 
join tb_get_car_order
using(order_id)
group by 1,2
) 
select
city 
,driver_id
,avg_grade
,avg_order_num
,avg_mileage
from a
where rk=1
order by 4
2.自查询
select
city 
,driver_id
,avg_grade
,avg_order_num
,avg_mileage
from 
(
select
city 
,driver_id
,round(avg(grade),1) avg_grade
,round(count(date(order_time))/count(distinct date(order_time)),1) avg_order_num
,round(sum(mileage)/count(distinct date(order_time)),3) avg_mileage
,dense_rank()over(partition by city order by avg(grade) desc) rk
from tb_get_car_record 
join tb_get_car_order
using(order_id)
group by 1,2
) a
where rk=1
order by 4




编辑于 2024-04-06 11:22:54 回复(0)
我服了,为什么最后会冒出来一个天津
with a as
(select  city,driver_id,avg_grade,count(*) as order_cnt,
count(DISTINCT DATE_FORMAT(order_time,'%Y%m%d')) as days,
sum(mileage) as total_mileage
from tb_get_car_order co
right join 

(
(select city,driver_id,avg_grade
from 
(select driver_id,city,avg(grade) as avg_grade,
dense_rank() over (partition by city order by avg(grade) asc) as ranking
from tb_get_car_order join tb_get_car_record using(order_id)
where fare is not null
group by driver_id,city)
as t1
where ranking = 1)
) 

as t2 using(driver_id)
group by city,driver_id)


select city,driver_id,round(avg_grade,1) as avg_grade,
round(order_cnt/days,1) as  avg_order_num,
round(total_mileage/days,3) as avg_mileage
from a
order by avg_order_num asc



编辑于 2024-03-19 09:47:43 回复(0)
with 
t as (  #总表
select city, order_time, driver_id as did, mileage, grade
from tb_get_car_record join tb_get_car_order using(order_id)
),
t1 as (  #司机平均分表
select city, did, avg(grade) as avg from t
group by city, did
), 
t2 as ( #由t1得到每个城市最高分
select city, max(avg) as max from t1
group by city
),
t3 as ( #由t1和t2得到最高评分司机
select did, avg from t1 inner join t2 using(city)
where avg=max 
),
t4 as ( #司机的日均接单和里程数
select did, 
    count(order_time)/count(distinct date(order_time)) as avg_n,
    sum(mileage)/count(distinct date(order_time)) as avg_m
from t
group by did
)

select city, did, round(avg(avg), 1), 
    round(avg(avg_n), 1), round(avg(avg_m), 3) 
from t3 
    inner join t using(did) 
    inner join t4 using(did)
group by city, did
order by round(avg(avg_n), 1);

编辑于 2024-02-12 22:08:09 回复(0)
# 一、利用 city, driver_id 去计算每个城市每个司机的平均评分,接单总数,接单天数,里程数
# 二、利用rank() 函数对于每个城市的司机按照平均评分从高到低进行排序
# 三、找出排序 = 1 的司机
select city, driver_id, avg_grade, avg_order_num, avg_mileage
from
(
select city, driver_id
    , avg_grade
    , round(order_cnt / day_cnt, 1) as avg_order_num
    , round(mileage / day_cnt, 3) as avg_mileage
    , rank() over(partition by city order by avg_grade desc ) as rk
from
(
select tgcr.city, tgco.driver_id
    , round(avg(tgco.grade), 1) as avg_grade
    , count(tgco.order_time) as order_cnt
    , count(distinct (date(tgco.order_time))) as day_cnt
    , sum(tgco.mileage) as mileage
from tb_get_car_record tgcr
join tb_get_car_order tgco on tgcr.order_id = tgco.order_id 
group by tgcr.city, tgco.driver_id ) a 
) b
where rk = 1
order by avg_order_num asc

发表于 2023-12-27 15:40:07 回复(0)