1 需求
- 即时订单和计划订单
订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。
请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。
- 配送信息表
delivery_info
| delivery_id (运单 *id* ) | order_id (订单id) | user_id (用户 id ) | order_date (下单日期) | custom_date (期望配送日期) |
|---|---|---|---|---|
| 1 | 1 | 101 | 2021-09-27 | 2021-09-29 |
| 2 | 2 | 101 | 2021-09-28 | 2021-09-28 |
| 3 | 3 | 101 | 2021-09-29 | 2021-09-30 |
- 期望结果
| percentage <decimal(16,2)> |
|---|
| 0.50 |
2 实现
- 思路
请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。
首先需要从数据集中拿出每个用户的首单,一般都是使用排序开窗函数进行操作。然后计算即时订单的比例,只需要从拿出的首单数据中分别计算两个指标,再相除即可,注意需求中需要保留两位小数,所以可以使用 decimal 类型来展示最终的结果。
- 实现
1 使用开窗函数获取每一个用户的首单数据
select * from (
select user_id,order_date,custom_date,
row_number() over(partition by user_id order by order_date) rn
from delivery_info
) t1 where rn=1
| user_id | order_date | custom_date | rn |
|---|---|---|---|
| 101 | 2021-09-27 | 2021-09-29 | 1 |
| 1010 | 2021-10-08 | 2021-10-10 | 1 |
| 102 | 2021-10-01 | 2021-10-01 | 1 |
| 103 | 2021-10-02 | 2021-10-03 | 1 |
| 104 | 2021-10-03 | 2021-10-04 | 1 |
| 105 | 2021-10-04 | 2021-10-04 | 1 |
| 106 | 2021-10-04 | 2021-10-04 | 1 |
| 107 | 2021-10-05 | 2021-10-05 | 1 |
| 108 | 2021-10-06 | 2021-10-06 | 1 |
| 109 | 2021-10-07 | 2021-10-08 | 1 |
2 直接在结果 1 的基础上进行指标的统计和结果的输出即可,需要将结果转换为
decimal(10,2)展示
select
cast(round(sum(if(order_date = custom_date, 1, 0)) / count(1), 2)
as decimal(10,2)) percentage
from (
select user_id,order_date,custom_date,
row_number() over(partition by user_id order by order_date) rn
from delivery_info
) t1 where rn=1
| percentage <decimal(16,2)> |
|---|
| 0.50 |
文章讲述了如何使用SQL中的开窗函数处理配送信息表,以获取每个用户的首个订单,并计算其中即时订单的比例,结果保留两位小数。示例查询展示了如何通过row_number()函数找出每个用户的首单,然后计算首单中即时订单的数量占总数的比例,最后以decimal类型显示结果。
695

被折叠的 条评论
为什么被折叠?



