You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在派生表中使用max()函数返回意外结果的SQL问题排查

SQL查询订单最多客户异常排查

问题场景

给定Orders表数据:

Orders表:
+--------------+-----------------+
| order_number | customer_number |
+--------------+-----------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 3 |
+--------------+-----------------+

需求是找出下订单数量最多的客户的customer_number,预期输出为3,但执行以下SQL后返回结果为[2,1]:

select max(c.d),customer_number from (Select Count(order_number) as d,customer_number  from Orders group by customer_number) as c

异常原因

你的SQL存在分组逻辑错误:外层查询同时使用了聚合函数max(c.d)和非聚合列customer_number,但未指定GROUP BY子句。这种情况下,数据库会随机返回一个非聚合列的值(此处恰好返回了customer_number=1),无法保证该值与max(c.d)对应。

正确写法

方式1:排序取第一条(简单高效)

SELECT customer_number
FROM Orders
GROUP BY customer_number
ORDER BY COUNT(order_number) DESC
LIMIT 1;

方式2:子查询匹配最大订单数

SELECT customer_number
FROM Orders
GROUP BY customer_number
HAVING COUNT(order_number) = (
    SELECT MAX(order_count)
    FROM (
        SELECT COUNT(order_number) AS order_count
        FROM Orders
        GROUP BY customer_number
    ) AS temp
);

方式3:窗口函数(支持MySQL8+、PostgreSQL等)

如果存在多个客户订单数并列最多的情况,该方式可返回所有符合条件的客户:

SELECT customer_number
FROM (
    SELECT 
        customer_number,
        RANK() OVER(ORDER BY COUNT(order_number) DESC) AS rnk
    FROM Orders
    GROUP BY customer_number
) AS temp
WHERE rnk = 1;

内容的提问来源于stack exchange,提问作者Moly Holy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:45:54