题目需求
订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。
请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。
期望结果如下:
| percentage <decimal(16,2)> |
|---|
| 0.50 |
需要用到的表:
配送信息表: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 |
题目存在问题
问题: 如果数据中,对于每个用户来说,首单对应的order_date那天 下单次多次且custom_date不完全相同,那么最终的结果将不确定。
原因: 这将导致 row_number()=1 的custom_date不确定
实现一
select cast(sum(if(custom_date = first_val, 1, 0)) / user_count as decimal(16, 2)) as percentage
from (
select user_id,
custom_date,
-- 1) 求出下单的用户个数
count(distinct user_id) over () as user_count,
-- 2)对每个用户的下单日期进行编号,后面取出 `第一次的订单`
row_number() over (partition by user_id order by order_date) as row_num,
-- 3)求出每个用户的首单日期
first_value(order_date) over (partition by user_id order by order_date) as first_val
from delivery_info
) t1
where row_num = 1
group by user_count;
题目来源
http://practice.atguigu.cn/#/question/13/desc?qType=SQL
文章讲述了如何从配送信息表中,通过SQL查询计算每个用户的首单中即时订单的比例,指出了如果存在同一天多个不同custom_date的情况会导致结果不确定的问题,并提供了一个实现查询的示例SQL语句。
808

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



