首页 > 试题广场 >

2021年国庆在北京接单3次及以上的司机统计信息

[编程题]2021年国庆在北京接单3次及以上的司机统计信息
  • 热度指数:90889 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

用户打车记录表tb_get_car_record


(uid-用户ID, city-城市, event_time-打车时间, end_time-打车结束时间, order_id-订单号)


打车订单表tb_get_car_order

(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星评价后填充。


问题:请统计2021年国庆7天期间在北京市接单至少3次的司机的平均接单数和平均兼职收入(暂不考虑平台佣金,直接计算完成的订单费用总额),结果保留3位小数。

输出示例
示例数据的输出结果如下

解释:
2021年国庆期间北京市的订单中,202共接了3单,兼职收入105;203接了4单,兼职收入137;201共接了1单,但取消了; 接单至少3次的司机有202和203,他两人全部总共接单数为7,总收入为242。因此平均接单数为3.500,平均收入为121.000;
示例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 DOUBLE COMMENT '行驶里程数',
    fare DOUBLE 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) ;

INSERT INTO tb_get_car_order(order_id, uid, driver_id, order_time, start_time, finish_time, mileage, fare, grade) VALUES
 (9002, 101, 201, '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', '2021-10-01 08:18:00', '2021-10-01 08:31:00', 15.0, 44, 5),
 (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),
 (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);

输出

北京|3.500|121.000
头像 webary
发表于 2021-12-08 20:48:51
2021年国庆在北京接单3次及以上的司机统计信息 明确题意: 统计2021年国庆7天期间在北京市接单至少3次的司机的平均接单数和平均兼职收入(暂不考虑平台佣金,直接计算完成的订单费用总额),结果保留3位小数。 问题分解: 计算2021国庆在北京接单至少3次的司机信息: 关联接单表和打车记录表: 展开全文
头像 玉树叶
发表于 2021-12-29 14:55:46
通过代码 select '北京' city, round(sum(driver_order) / count(*),3) avg_order_num, round(sum(money) / count(*),3) avg_income from(select 展开全文
头像 Alex_John
发表于 2022-01-20 12:01:25
题意 给你一张用户打车记录表,和一张打车记录表,请你查询出2021年国庆7天期间,在北京接单至少三次的司机平均的接单数和平均兼职收入 思路: 首先,我们需要查询出的是每个司机的平均接单数和平均的兼职收入,但每个司机的接单数和收入不是既存字段,所以我们需要先获取这两个数据才行 获取这两个数据的同时, 展开全文
头像 月球上撒欢儿
发表于 2022-03-12 14:00:02
思路: 第一步: 先根据 driver_id 分组,统计单个 司机接单数量 >= 3 的司机 第二步: 再计算出单个司机的总钱数 select count(*) driver_order, sum(fare) money from tb_get_car_record t_r join tb_ 展开全文
头像 Ryoryo
发表于 2021-12-02 15:28:56
趁人少分享一下自己的第一个双百哈哈哈 内部一个筛选 先选取符合条件的司机的订单量,总收入,外面再套一个求avg就行了。 select t.city,round(avg(avg_order_num),3),round(avg(avg_income),3) from ( select driver_i 展开全文
头像 酸菜鱼土豆大侠
发表于 2022-12-03 17:16:37
【场景】:在某个数据的基础上再计算 【分类】:in子查询、where (a,b) in、group by having 分析思路 注意: 1.外键是order_id,不能用uid做连接 2.取消了订单也算接单,不要把问题想的太复杂 关键是理解业务 首先,搞清楚5个时间的业务关系 event_ti 展开全文
头像 要瘦的三岁
发表于 2022-03-15 21:34:55
一开始这里count(1) 写成了count(start_time) 后来发现我想多了,只要司机接单就可了 (select driver_id,count(1) as num,sum(fare) as income from tb_get_car_order left join tb_get_ca 展开全文
头像 视星等无穷
发表于 2022-04-19 14:22:47
1.t1表 2021年国庆7天在北京接单3次及以上的司机的接单数目和收入数目 注意司机接单但被用户取消的订单也算在接单数内 2.计算平均接单数和平均兼职收入 select '北京' as city, round(avg(cnt),3) avg_order_num, round(avg(income) 展开全文
头像 jl0427
发表于 2023-07-18 10:55:29
SELECT "北京" as city, ROUND(AVG(order_num), 3) as avg_order_num, ROUND(AVG(income), 3) as avg_income FROM ( SELECT driver_id, COUNT(o 展开全文
select '北京' as 'city', round(avg(c.d),3) as avg_order_num, round(avg(c.e),3) as avg_income from ( select b.driver_ 展开全文