即时订单占比:布尔条件求平均
LeetCode 1173 · 条件计数、百分比
面试怎么回答
ROUND(SUM(order_date = customer_pref_delivery_date) / COUNT(*) * 100, 2),或者直接 AVG 布尔表达式再乘 100。注意先乘 100 再四舍五入。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
配送表记录每个订单的下单日期和顾客期望的配送日期。两者相同的叫即时订单。求即时订单占全部订单的百分比,保留两位小数。
表结构
- Delivery:delivery_id(主键)、customer_id、order_date、customer_pref_delivery_date
思路
占比 = 满足条件的行数 / 总行数。用 SUM(IF(条件, 1, 0)) / COUNT(*),或者在 MySQL 里直接 AVG(条件),再乘 100 保留两位。
参考解法
select round(sum(if(order_date=customer_pref_delivery_date,1,0))/count(*)*100,2) immediate_percentage
from Delivery
另一种写法:MySQL 中布尔表达式求平均就是占比
SELECT ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
FROM Delivery
易错点
- 先 ROUND 再乘 100 会损失精度,要先乘再 ROUND。