跳转至

1867. 最大数量高于平均水平的订单 🔒

题目描述

表:OrdersDetails

+-------------+------+
| Column Name | Type |
+-------------+------+
| order_id    | int  |
| product_id  | int  |
| quantity    | int  |
+-------------+------+
(order_id, product_id) 是该表的主键(由多个列组合而成的唯一值)。
一个订单由多行表示,每行对应订单中的一个产品。
该表中的每一行包含订单 order_id 中产品 product_id 的订购数量 quantity。

 

你正在运营一个电子商务网站,目前正在寻找 不平衡订单不平衡订单 是指这样一个订单:其 最大 商品数量 严格大于 所有订单(包括该订单自身)的 平均 商品数量。

一个订单的 平均 商品数量计算方式为:(该订单所有商品的总数量)/(该订单中不同商品的数量)。 一个订单的 最大 商品数量是该订单中任意单个商品的 quantity 中的最大值。

编写一个解决方案,找出所有 不平衡订单 order_id

任何顺序 返回结果表。

结果格式如下所示。

 

示例 1:

输入:

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 是不平衡订单,因为它们的最大商品数量大于所有订单的平均商品数量。

解法

方法一

思考

要找出「最大单行数量」严格大于「任意订单平均数量的最大值」的订单。平均与最大都需按 \(order\_id\) 聚合,再做跨订单比较。

先按订单求出 \(MAX(quantity)\)\(SUM/COUNT\),再用子查询取全部平均的最大值作为阈值。外层筛选最大数量超过该阈值的 \(order\_id\)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Write your MySQL query statement below
WITH
    t AS (
        SELECT
            order_id,
            MAX(quantity) AS max_quantity,
            SUM(quantity) / COUNT(1) AS avg_quantity
        FROM OrdersDetails
        GROUP BY order_id
    )
SELECT order_id
FROM t
WHERE max_quantity > (SELECT MAX(avg_quantity) FROM t);

评论