$\quad$传送门
$\quad$这题相对来说,细节较多,一般很难一次性写完然后通过。具体体现在如下方面:需要对,group by 这个语句有较深的理解,以及整个mysql的执行顺序有较深入的理解。下面是几个重要的点:
$\quad$那么在理清,sql的执行顺序之后,这题的就迎刃而解了,先创建一个子表$t1$,这个表记录,每一个用户最早订单的时间,以及$customer\_id$用于连接。
$\quad$由于,我们通过聚合$customer\_id$,得到每个用户的最早订单时间后,会丢失该订单的预期时间,因此我们需要通过子表$t2$,来得到这个字段。
$\quad$最后通过$customer\_id$以及订单的时间,将$t1$和$t2$进行连接即可得到答案。
Code
select
round(count(if(t1.earliest = t2.customer_pref_delivery_date , 1 ,null))/count(*) , 4) * 100 immediate_percentage
from
(select
customer_id,
min(order_date) as earliest
from
Delivery
group by customer_id) t1
left join(
select
customer_id,
order_date,
customer_pref_delivery_date
from Delivery
) t2
on t1.customer_id = t2.customer_id and t1.earliest = t2.order_date;