跳到主要内容

SQL 辅助驾驶里程占比:辅助驾驶里程/总行驶里程(理想汽车面试题)

一、题目

现有一张车辆行驶里程明细表 t1_driving_log,记录了每辆理想汽车每天的行驶数据,包含总行驶里程和辅助驾驶开启里程。请计算每辆车在统计周期内辅助驾驶里程占总行驶里程的占比,并按占比降序排列。

行驶明细表 t1_driving_log:

+---------+-------------+-----------------+----------------+
| car_id | drive_date | total_distance | adas_distance |
+---------+-------------+-----------------+----------------+
| C001 | 2024-01-01 | 85.6 | 42.3 |
| C001 | 2024-01-02 | 120.4 | 78.9 |
| C001 | 2024-01-03 | 56.2 | 12.0 |
| C002 | 2024-01-01 | 200.0 | 150.5 |
| C002 | 2024-01-02 | 95.3 | 95.3 |
| C003 | 2024-01-01 | 30.0 | 0.0 |
| C003 | 2024-01-02 | 45.7 | 20.1 |
| C003 | 2024-01-03 | 78.5 | 55.4 |
+---------+-------------+-----------------+----------------+

二、思路分析

本题考察聚合计算和占比求解,难度较低。核心思路是对每辆车按天计算总里程和辅助驾驶里程,然后求占比。

解题步骤

  1. car_id 分组,使用 SUM() 分别聚合 total_distanceadas_distance
  2. 计算辅助驾驶里程占比 = SUM(adas_distance) / SUM(total_distance)
  3. 按占比降序排列。
维度评分
题目难度⭐️
题目清晰度⭐️⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️⭐️⭐️

三、逐步推导

1. 计算每辆车总里程和辅助驾驶里程

执行SQL

select car_id,
sum(total_distance) as total_km,
sum(adas_distance) as adas_km
from t1_driving_log
group by car_id

执行结果

+---------+-----------+----------+
| car_id | total_km | adas_km |
+---------+-----------+----------+
| C001 | 262.2 | 133.2 |
| C002 | 295.3 | 245.8 |
| C003 | 154.2 | 75.5 |
+---------+-----------+----------+
3 rows selected (0.977 seconds)(https://www.dwsql.com)

2. 计算占比并排序

执行SQL

select car_id,
sum(total_distance) as total_km,
sum(adas_distance) as adas_km,
round(sum(adas_distance) / sum(total_distance), 4) as adas_rate
from t1_driving_log
group by car_id
order by adas_rate desc

执行结果

+---------+-----------+----------+------------+
| car_id | total_km | adas_km | adas_rate |
+---------+-----------+----------+------------+
| C002 | 295.3 | 245.8 | 0.8324 |
| C001 | 262.2 | 133.2 | 0.508 |
| C003 | 154.2 | 75.5 | 0.4896 |
+---------+-----------+----------+------------+
3 rows selected (0.633 seconds)(https://www.dwsql.com)

四、常见坑点

坑1:除零问题total_distanceadas_distance 可能为 0 或 NULL。分母为 0 时相除会报错或返回 NULL,建议用 NULLIF(SUM(total_distance), 0) 兜底,或在 WHERE 中过滤掉无行驶里程的记录。

坑2:占比超过 1 的数据异常 — 正常情况下 adas_distance <= total_distance,但脏数据可能出现 adas > total,导致占比 > 1。需在计算时过滤异常记录,或用 LEAST(rate, 1) 截断。

坑3:SUM 的精度double 多次累加会产生浮点误差,占比结果需用 round() 控制小数位,避免出现 0.5080000001 这类尾数。

五、知识点总结

考点说明
SUM 聚合对分组内数值列求和,配合 GROUP BY 得到每辆车总里程与辅助驾驶里程
ROUND 精度控制占比结果用 round(x, 4) 控制小数位,避免浮点尾数
ORDER BY 排序按占比字段降序排列,得到从高到低的排名结果

六、建表语句和数据插入

点击展开 DDL & DML
-- 建表语句
create table t1_driving_log (
car_id string comment '车辆ID',
drive_date string comment '行驶日期',
total_distance double comment '总行驶里程(km)',
adas_distance double comment '辅助驾驶里程(km)'
) comment '车辆行驶里程明细表';

-- 数据插入
insert into t1_driving_log values
('C001', '2024-01-01', 85.6, 42.3),
('C001', '2024-01-02', 120.4, 78.9),
('C001', '2024-01-03', 56.2, 12.0),
('C002', '2024-01-01', 200.0, 150.5),
('C002', '2024-01-02', 95.3, 95.3),
('C003', '2024-01-01', 30.0, 0.0),
('C003', '2024-01-02', 45.7, 20.1),
('C003', '2024-01-03', 78.5, 55.4);
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看