题目描述

(通过次数3,859 | 提交次数5,524,通过率69.86%)

OrdersDetails 表
+-------------+------+
| Column Name | Type |
+-------------+------+
| order_id    | int  |
| product_id  | int  |
| quantity    | int  |
+-------------+------+
(order_id, product_id) 是此表的主键。
单个订单表示为多行,订单中的每个产品对应一行。
此表的每一行都包含订单id中产品id的订购数量。

您正在运行一个电子商务网站,该网站正在寻找不平衡的订单。不平衡订单的订单最大数量严格大于每个订单(包括订单本身)的平均数量。
订单的平均数量计算为(订单中所有产品的总数量)/(订单中不同产品的数量)。订单的最大数量是订单中任何单个产品的最高数量。
编写SQL查询以查找所有不平衡订单的订单id。
按任意顺序返回结果表。

查询结果格式如下例所示。
示例:
输入: 
OrdersDetails 表:
+----------+------------+----------+
| order_id | product_id | quantity |
+----------+------------+----------+
| 1        | 1          | 12       |
| 1        | 2          | 10       |
| 1        | 3          | 15       |
| 2        | 1          | 8        |
| 2        | 4          | 4        |
| 2        | 5          | 6        |
| 3        | 3          | 5        |
| 3        | 4          | 18       |
| 4        | 5          | 2        |
| 4        | 6          | 8        |
| 5        | 7          | 9        |
| 5        | 8          | 9        |
| 3        | 9          | 20       |
| 2        | 9          | 4        |
+----------+------------+----------+
输出: 
+----------+
| order_id |
+----------+
| 1        |
| 3        |
+----------+
解释: 
每份订单的平均数量为:
- order_id=1: (12+10+15)/3 = 12.3333333
- order_id=2: (8+4+6+4)/4 = 5.5
- order_id=3: (5+18+20)/3 = 14.333333
- order_id=4: (2+8)/2 = 5
- order_id=5: (9+9)/2 = 9

每个订单的最大数量为:
- order_id=1: max(12, 10, 15) = 15
- order_id=2: max(8, 4, 6, 4) = 8
- order_id=3: max(5, 18, 20) = 20
- order_id=4: max(2, 8) = 8
- order_id=5: max(9, 9) = 9
订单1和订单3是不平衡的,因为它们的最大数量超过了它们订单的平均数量。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/orders-with-maximum-quantity-above-average
//测试数据
Create table If Not Exists OrdersDetails (order_id int, product_id int, quantity int);

insert into OrdersDetails (order_id, product_id, quantity) values ('1', '1', '12');
insert into OrdersDetails (order_id, product_id, quantity) values ('1', '2', '10');
insert into OrdersDetails (order_id, product_id, quantity) values ('1', '3', '15');
insert into OrdersDetails (order_id, product_id, quantity) values ('2', '1', '8');
insert into OrdersDetails (order_id, product_id, quantity) values ('2', '4', '4');
insert into OrdersDetails (order_id, product_id, quantity) values ('2', '5', '6');
insert into OrdersDetails (order_id, product_id, quantity) values ('3', '3', '5');
insert into OrdersDetails (order_id, product_id, quantity) values ('3', '4', '18');
insert into OrdersDetails (order_id, product_id, quantity) values ('4', '5', '2');
insert into OrdersDetails (order_id, product_id, quantity) values ('4', '6', '8');
insert into OrdersDetails (order_id, product_id, quantity) values ('5', '7', '9');
insert into OrdersDetails (order_id, product_id, quantity) values ('5', '8', '9');
insert into OrdersDetails (order_id, product_id, quantity) values ('3', '9', '20');
insert into OrdersDetails (order_id, product_id, quantity) values ('2', '9', '4');

解题思路

说实在话,这道题的题目成功把我绕晕了。。。
题目描述阅读了好几次,而且参考了别人的解题思路才理顺。
其实题目本身很简单!
OrdersDetails表中保存了每个订单中每个产品的订购数量。每个订单的产品平均数量=该订单下的产品订购总数量/产品数。而所有订单的最大产品平均数量为订单的产品平均数量的最大值。
比如,订单1的产品平均数量为10,订单2的产品平均数量为12,订单3的产品平均数量为9,那么,所有订单的最大产品平均数量为12。
知道了所有订单的最大产品平均数量的含义,使用SQL计算起来就比较方便了。
可以通过以下2个步骤实现:
第一步:计算出每个订单的产品平均数量。
使用GROUP BY+AVG即可实现。
第二步:计算出所有订单的最大产品平均数量。
对第一步中的产品平均数量取MAX即可。
计算出所有订单的最大产品平均数量后,再计算不平衡的订单就比较容易了:只要订单中有任意一个产品的订购数量超过了所有订单的最大产品平均数量,那么该订单就是不平衡的订单。
使用WHERE条件可以轻松实现该判断。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。

select
    distinct
    order_id
from OrdersDetails
where quantity > (
    select max(avg_quantity) from (
    select b.order_id,avg(b.quantity) avg_quantity
    from OrdersDetails b
    group by b.order_id
    )a
);
picture loss