• Sql力扣算法:262. 行程和用户


    题目描述:

    SQL架构
    表:Trips
    在这里插入图片描述

    id 是这张表的主键。
    这张表中存所有出租车的行程信息。每段行程有唯一 id ,其中 client_id 和 driver_id 是 Users 表中 users_id 的外键。
    status 是一个表示行程状态的枚举类型,枚举成员为(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’) 。

    表:Users
    在这里插入图片描述

    users_id 是这张表的主键。
    这张表中存所有用户,每个用户都有一个唯一的 users_id ,role 是一个表示用户身份的枚举类型,枚举成员为 (‘client’, ‘driver’, ‘partner’) 。
    banned 是一个表示用户是否被禁止的枚举类型,枚举成员为 (‘Yes’, ‘No’) 。

    取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。

    写一段 SQL 语句查出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户(乘客和司机都必须未被禁止)的取消率。非禁止用户即 banned 为 No 的用户,禁止用户即 banned 为 Yes 的用户。

    返回结果表中的数据可以按任意顺序组织。其中取消率 Cancellation Rate 需要四舍五入保留 两位小数 。

    查询结果格式如下例所示。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/trips-and-users
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    案例:

    在这里插入图片描述

    解决方案:

    /* Write your T-SQL query statement below */
    
    select a.request_at Day,Convert(decimal(12,2),Convert(decimal(12,2),isnull(b.num,0)) / Convert(decimal(12,2),isnull(a.num,1))) as [Cancellation Rate] from 	--取消率
        (select a.request_at,count(1) num from Trips a  --有效订单数
        left join Users b on a.client_id = b.users_id
        left join Users c on a.driver_id = c.users_id
        where b.banned <> 'Yes' and c.banned <> 'Yes'
        group by a.request_at) a    
        left join ( select a.request_at,count(1) num from Trips a   --有效订单取消数
        left join Users b on a.client_id = b.users_id
        left join Users c on a.driver_id = c.users_id
        where b.banned <> 'Yes' and c.banned <> 'Yes' and a.status <> 'completed'
        group by a.request_at) b 
        on a. request_at = b.request_at
    where a.request_at >= '2013-10-01' and a.request_at < '2013-10-04'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    提交结果:

    在这里插入图片描述

    解题思路:

    1.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,根据日期group by,获得日期总订单数,日期,封装成子查询表T1。

    2.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,并且订单状态不等于完成,根据日期group by,获得日期总有效用户取消订单数,日期,封装成子查询表T2。

    3.根据日期关联有效总订单T1表和有效取消订单T2表,Convert(decimal(12,2),isnull(T2有效取消订单数,0)) / Convert(decimal(12,2),isnull(T1总有效订单数,1))) as [Cancellation Rate]

  • 相关阅读:
    vscode语言插件开发资料
    创建NuGet本地包源
    mit6.824lab2D-Debug记录
    前端性能优化方法与实战04 指标采集:首屏时间指标采集具体办法
    Redis-key的基本命令和Redis最常用的数据类型:String
    CubeMx笔记 --SPI
    牛客训练3
    代码简洁之道:对象转换神器MapStruct
    sklearn实现多项式线性回归_一元/多元 【Python机器学习系列(八)】
    C++怎么读取XML文件?
  • 原文地址:https://blog.csdn.net/wuyanEdwardElrid/article/details/127652869