13. 即时订单比例

文章讲述了如何从配送信息表中,通过SQL查询计算每个用户的首单中即时订单的比例,指出了如果存在同一天多个不同custom_date的情况会导致结果不确定的问题,并提供了一个实现查询的示例SQL语句。

题目需求

订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。
请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。

期望结果如下:

percentage
<decimal(16,2)>
0.50

需要用到的表:

配送信息表:delivery_info

delivery_id (运单 idorder_id (订单id)user_id (用户 id )order_date (下单日期)custom_date (期望配送日期)
111012021-09-272021-09-29
221012021-09-282021-09-28
331012021-09-292021-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dataer__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值