首页 > 数据库 >力扣-Mysql-3308- 寻找表现最佳的司机(中等)

力扣-Mysql-3308- 寻找表现最佳的司机(中等)

时间:2024-11-15 12:19:46浏览次数:3  
标签:rating int driver 力扣 3308 Mysql fuel type id

一、题目来源

3308. 寻找表现最佳的司机 - 力扣(LeetCode)

二、数据表结构

表:Drivers

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| driver_id    | int     |
| name         | varchar |
| age          | int     |
| experience   | int     |
| accidents    | int     |
+--------------+---------+
(driver_id) 是这张表的唯一主键。
每一行包含一个司机 ID,他们的名字,年龄,驾龄年数,以及事故数。

表:Vehicles

+--------------+---------+
| vehicle_id   | int     |
| driver_id    | int     |
| model        | varchar |
| fuel_type    | varchar |
| mileage      | int     |
+--------------+---------+
(vehicle_id, driver_id, fuel_type) 是这张表的唯一主键。
每一行包含机动车 ID,驾驶员,车型,动力类型和里程数。

表:Trips

+--------------+---------+
| trip_id      | int     |
| vehicle_id   | int     |
| distance     | int     |
| duration     | int     |
| rating       | int     |
+--------------+---------+
(trip_id) 是这张表的唯一主键。
每一行包含行程 ID,使用的机动车,覆盖的距离(以米计),行程市场(以分钟计),以及乘客评分(1-5)。



三、需求

优步正在基于司机的行程分析他们的情况。编写一个解决方案,根据下列标准来找到 每种动力类型 中 表现最好的司机

  1. 一个司机的表现由他们行程的 平均评分 计算。平均评分应该舍入到 2 位小数。
  2. 如果两个司机有相同的平均评分,里程数更多 的司机评分更高。
  3. 如果 依旧持平,选择 事故数最少 的司机。

返回结果表以 fuel_type 升序 排序。

四、示例数据

输入:

Drivers 表:

+-----------+----------+-----+------------+-----------+
| driver_id | name     | age | experience | accidents |
+-----------+----------+-----+------------+-----------+
| 1         | Alice    | 34  | 10         | 1         |
| 2         | Bob      | 45  | 20         | 3         |
| 3         | Charlie  | 28  | 5          | 0         |
+-----------+----------+-----+------------+-----------+

Vehicles 表:

+------------+-----------+---------+-----------+---------+
| vehicle_id | driver_id | model   | fuel_type | mileage |
+------------+-----------+---------+-----------+---------+
| 100        | 1         | Sedan   | Gasoline  | 20000   |
| 101        | 2         | SUV     | Electric  | 30000   |
| 102        | 3         | Coupe   | Gasoline  | 15000   |
+------------+-----------+---------+-----------+---------+

Trips 表:

+---------+------------+----------+----------+--------+
| trip_id | vehicle_id | distance | duration | rating |
+---------+------------+----------+----------+--------+
| 201     | 100        | 50       | 30       | 5      |
| 202     | 100        | 30       | 20       | 4      |
| 203     | 101        | 100      | 60       | 4      |
| 204     | 101        | 80       | 50       | 5      |
| 205     | 102        | 40       | 30       | 5      |
| 206     | 102        | 60       | 40       | 5      |
+---------+------------+----------+----------+--------+

输出:

+-----------+-----------+--------+----------+
| fuel_type | driver_id | rating | distance |
+-----------+-----------+--------+----------+
| Electric  | 2         | 4.50   | 180      |
| Gasoline  | 3         | 5.00   | 100      |
+-----------+-----------+--------+----------+

解释:

  • 对于动力类型 Gasoline,Alice(司机 1)和 Charlie(司机 3)有行程。Charlie 平均评分为 5.0,而 Alice 为 4.5。因此,选择 Charlie。
  • 对于动力类型 Electric,Bob(司机 2)是唯一的司机,评分为 4.5,因此选择他。

输出表以 fuel_type 升序排序。



五、分析


1.文字分析
 

第一步:首先进行三表关联查询,获取动力类型fuel_type 、driver_id、平均评分avg(rating)以及总距离sum(distance);

第二步:根据需求,按照fuel_type进行分组,按照平均评分avg_rating的降序,总里程数的降序以及事故数的升序进行排名 ;

第三步:根据需求选择排名为1的数据,并按照动力类型fuel_type进行升序排序。

2.图解


六、代码实现

with t1 AS (
    SELECT
        fuel_type,
        v.driver_id,
        ROUND(AVG(rating), 2) AS rating,
        SUM(distance) AS distance,
        rank() over(partition by fuel_type order by AVG(rating) desc,SUM(mileage) desc,sum(accidents)) as rk
    FROM
        drivers d
            JOIN vehicles v ON d.driver_id = v.driver_id
            JOIN trips t ON v.vehicle_id = t.vehicle_id
    group by fuel_type,v.driver_id
)
SELECT
    fuel_type,
    driver_id,
    rating,
    distance
from t1
where rk = 1
ORDER BY fuel_type;



七、总结
 

本题需求为寻找表现最佳的司机:

对三个表进行三表联查,然后根据需求求出平均评分 avg_rating、总里程 sum_meliage 和事故数 sum_accidents,然后根据动力类型 fuel_type 进行分组,对平均评分的降序(avg_rating desc)、总里程的降序(sum_meliage desc )以及事故数的升序(sum_accidents asc)对数据进行排名,使用 rank() 函数即可,然后获取排名为1的数据,即为所求,最终对数据按照 动力类型 fuel_type 进行升序排序。

标签:rating,int,driver,力扣,3308,Mysql,fuel,type,id
From: https://blog.csdn.net/Jotcy/article/details/143793371

相关文章

  • mysql基础函数
    函数是一段可以直接调用的程序字符串函数|CONCAT(S1,S2,S3)|字符串拼接将s1,s2s3拼接成一个字符串||LOWER(str)|将字符串str全部转为小写||UPPER(str)|将字符串str全部转为大写||LPAD(str,n,pad)|左填充,用字符串Pad对str的左边......
  • 【原创】java+ssm+mysql物流信息网系统设计与实现
    个人主页:程序猿小小杨个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎博客内容:Java项目实战、项目演示、技术分享文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。前言:随着全球经济一体化的不断推进,物流业作为支撑企业运营的重要环节,其管理和......
  • 【原创】java+ssm+mysql商品库存管理系统(进销存)设计与实现
    个人主页:程序猿小小杨个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎博客内容:Java项目实战、项目演示、技术分享文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。前言:随着市场竞争的日益激烈,企业面临着巨大的竞争压力。为了在市场中立于不败......
  • linux安装mysql
    1.linux在线安装mysql这里直接在线安装即可yuminstallmysql-server要是有网络,在线安装最为便捷,省去自己手动下包的麻烦2.启动mysqlsystemctlstartmysqld#启动mysql服务systemctlenablemysqld#设置开机自启动3.修改mysql密码初始密码需及时修改这里......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现九
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现十
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • MySQL数据库:SQL语言入门 【3】(学习笔记)
    5,TCL—— 事务控制语言(TransactionControlLanguage)     用于数据库的事务管理。(1)事务的概念+作用     事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由DBMS(数......
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
    目录 2,DML—— 数据操作语言(DataManipulationLanguage)(1)insert  增加 数据(2)delete 删除 数据    truncate 删除表和数据,再创建一个新表(3)update 修改 数据3,DDL——数据定义语言(DataDefinitionLanguage)(1)create 创建数据库对象(2)drop 删除......
  • MySQL数据库:SQL语言入门 【1】(学习笔记)
    SQL(StructuredQueryLanguage)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。(95%适用于所有关系型数据库)【 SQL是关系型数据库通用的操作语言】在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能......
  • mysql可视化工具 Navicat Premium 12解压版
    通过网盘分享的文件:NavicatPremium12解压版.rar链接:https://pan.baidu.com/s/1kDLlrcaiQRYGLfN5L-IpPA?pwd=3k6h提取码:3k6h--来自百度网盘超级会员v8的分享 1.解压到指定路径 2.快捷方式,快捷方式用不了,就直接在该文件中直接打开 3.测试链接    ......