• 1651. Hopper 公司查询 III


    SQL架构

    Table: Drivers

    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | driver_id   | int     |
    | join_date   | date    |
    +-------------+---------+
    driver_id是该表的主键。
    该表的每一行均包含驾驶员的ID以及他们加入Hopper公司的日期。

    Table: Rides

    +--------------+---------+
    | Column Name  | Type    |
    +--------------+---------+
    | ride_id      | int     |
    | user_id      | int     |
    | requested_at | date    |
    +--------------+---------+
    ride_id是该表的主键。 
    该表的每一行均包含行程ID(ride_id),用户ID(user_id)以及该行程的日期(requested_at)。 
    该表中可能有一些不被接受的乘车请求。
    

    Table: AcceptedRides

    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | ride_id       | int     |
    | driver_id     | int     |
    | ride_distance | int     |
    | ride_duration | int     |
    +---------------+---------+
    ride_id是该表的主键。 
    该表的每一行都包含已接受的行程信息。 
    表中的行程信息都在“Rides”表中存在。

    编写SQL查询以计算从 2020年1月至3月至2020年10月至12月 的每三个月窗口的 average_ride_distance 和 average_ride_duration 。将 average_ride_distance 和 average_ride_duration 四舍五入至 小数点后两位 。
    通过将三个月的总 ride_distance 相加并除以 3 来计算 average_ride_distance 。average_ride_duration 的计算方法与此类似。
    返回按 month 升序排列的结果表,其中 month 是起始月份的编号(一月为 1,二月为 2 ...)。

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

    示例1:

    输入: 
    Drivers table:
    +-----------+------------+
    | driver_id | join_date  |
    +-----------+------------+
    | 10        | 2019-12-10 |
    | 8         | 2020-1-13  |
    | 5         | 2020-2-16  |
    | 7         | 2020-3-8   |
    | 4         | 2020-5-17  |
    | 1         | 2020-10-24 |
    | 6         | 2021-1-5   |
    +-----------+------------+
    Rides table:
    +---------+---------+--------------+
    | ride_id | user_id | requested_at |
    +---------+---------+--------------+
    | 6       | 75      | 2019-12-9    |
    | 1       | 54      | 2020-2-9     |
    | 10      | 63      | 2020-3-4     |
    | 19      | 39      | 2020-4-6     |
    | 3       | 41      | 2020-6-3     |
    | 13      | 52      | 2020-6-22    |
    | 7       | 69      | 2020-7-16    |
    | 17      | 70      | 2020-8-25    |
    | 20      | 81      | 2020-11-2    |
    | 5       | 57      | 2020-11-9    |
    | 2       | 42      | 2020-12-9    |
    | 11      | 68      | 2021-1-11    |
    | 15      | 32      | 2021-1-17    |
    | 12      | 11      | 2021-1-19    |
    | 14      | 18      | 2021-1-27    |
    +---------+---------+--------------+
    AcceptedRides table:
    +---------+-----------+---------------+---------------+
    | ride_id | driver_id | ride_distance | ride_duration |
    +---------+-----------+---------------+---------------+
    | 10      | 10        | 63            | 38            |
    | 13      | 10        | 73            | 96            |
    | 7       | 8         | 100           | 28            |
    | 17      | 7         | 119           | 68            |
    | 20      | 1         | 121           | 92            |
    | 5       | 7         | 42            | 101           |
    | 2       | 4         | 6             | 38            |
    | 11      | 8         | 37            | 43            |
    | 15      | 8         | 108           | 82            |
    | 12      | 8         | 38            | 34            |
    | 14      | 1         | 90            | 74            |
    +---------+-----------+---------------+---------------+
    输出: 
    +-------+-----------------------+-----------------------+
    | month | average_ride_distance | average_ride_duration |
    +-------+-----------------------+-----------------------+
    | 1     | 21.00                 | 12.67                 |
    | 2     | 21.00                 | 12.67                 |
    | 3     | 21.00                 | 12.67                 |
    | 4     | 24.33                 | 32.00                 |
    | 5     | 57.67                 | 41.33                 |
    | 6     | 97.33                 | 64.00                 |
    | 7     | 73.00                 | 32.00                 |
    | 8     | 39.67                 | 22.67                 |
    | 9     | 54.33                 | 64.33                 |
    | 10    | 56.33                 | 77.00                 |
    +-------+-----------------------+-----------------------+
    解释: 
    到1月底-->平均骑行距离=(0+0+63)/3=21,平均骑行持续时间=(0+0+38)/3=12.67
    到2月底-->平均骑行距离=(0+63+0)/3=21,平均骑行持续时间=(0+38+0)/3=12.67
    到3月底-->平均骑行距离=(63+0+0)/3=21,平均骑行持续时间=(38+0+0)/3=12.67
    到4月底-->平均骑行距离=(0+0+73)/3=24.33,平均骑行持续时间=(0+0+96)/3=32.00
    到5月底-->平均骑行距离=(0+73+100)/3=57.67,平均骑行持续时间=(0+96+28)/3=41.33
    到6月底-->平均骑行距离=(73+100+119)/3=97.33,平均骑行持续时间=(96+28+68)/3=64.00
    到7月底-->平均骑行距离=(100+119+0)/3=73.00,平均骑行持续时间=(28+68+0)/3=32.00
    到8月底-->平均骑行距离=(119+0+0)/3=39.67,平均骑行持续时间=(68+0+0)/3=22.67
    9月底-->平均骑行距离=(0+0+163)/3=54.33,平均骑行持续时间=(0+0+193)/3=64.33
    到10月底-->平均骑行距离=(0+163+6)/3=56.33,平均骑行持续时间=(0+193+38)/3=77.00
    1. with recursive t3 as (select '2020-01-01' n
    2. union all select date_add(n,interval 1 month) # 得到 (2020年的 112月 但是 会多一个 20211yue 不要紧后面会滤掉)
    3. from t3 where year(n) =2020),
    4. t1 as (
    5. select
    6. sum(ride_distance) ride_distance,sum(ride_duration) ride_duration,month(requested_at) `month` #得到应有的每月骑行距离和骑行持续时间
    7. from
    8. (
    9. select
    10. a.ride_distance,a.ride_duration,r.requested_at
    11. from
    12. AcceptedRides a left join Rides r
    13. using(ride_id)
    14. )s1
    15. where date_format(requested_at,'%Y') = '2020'
    16. group by date_format(requested_at,'%Y-%m')
    17. )
    18. select
    19. month,average_ride_distance,average_ride_duration
    20. from
    21. (
    22. select
    23. month ,round(sum(ride_distance) over(order by month rows between current row and 2 following ) /3,2) average_ride_distance,round(sum(ride_duration) over(order by month rows between current row and 2 following ) /3,2) average_ride_duration
    24. from
    25. (
    26. select ride_distance,ride_duration,month `month` #上下拼接 取到完整的12个月
    27. from
    28. t1
    29. union all
    30. select
    31. 0 ride_distance,0 ride_duration, month(n) `month` # 没有的月份骑行距离和骑行持续时间置零
    32. from
    33. t3
    34. where month(n) not in (select month from t1 ) and year(n) = 2020
    35. ) s1
    36. )ss1
    37. where month not in(11,12) #最后筛选掉 11 12月的内容

  • 相关阅读:
    Python实现基于移动网络通讯行为的风险用户识别
    bash和sh的区别
    Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性
    API是什么?解密API背后的奥秘
    1.java环境搭建与eclipse安装和配置
    C++ auto
    AWS-Lambda之导入自定义包-pip包
    HTML期末大作业(HTML+CSS+JavaScript响应式游戏资讯网站bootstrap网页)
    工业智能网关BL110应用之四十五: 数据上传云平台Modbus TCP Server配置
    Lua快速入门教程
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/125534347