订阅更新

即时订单占比:布尔条件求平均

SQL 实战 123 题 · 第 73 题 简单 约 2 分钟读完

LeetCode 1173 · 条件计数、百分比

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

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。
刷题进度保存在当前浏览器