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

使用MIN(order_date)后如何获取同行列数据?SQL问题排查与修正

问题原因

当你执行GROUP BY customer_id分组查询时,仅对customer_id和聚合函数min(order_date)做了明确处理,但customer_pref_delivery_date既不在GROUP BY子句中,也没有用聚合函数包裹。在MySQL关闭ONLY_FULL_GROUP_BY模式的情况下,数据库会随机从该customer_id对应的分组行里选取一个customer_pref_delivery_date的值,并不保证和min(order_date)对应的行匹配,这就是customer_id=3的结果里取到2019-08-24那行配送日期的原因。

修正方法

方法1:子查询关联原表

先通过子查询找到每个用户的最早订单日期,再和原表关联,精准匹配到对应行的数据:

SELECT d.customer_id, d.order_date AS first_date, d.customer_pref_delivery_date
FROM Delivery d
INNER JOIN (
    SELECT customer_id, MIN(order_date) AS first_order_date
    FROM Delivery
    GROUP BY customer_id
) t ON d.customer_id = t.customer_id AND d.order_date = t.first_order_date
ORDER BY d.customer_id;

方法2:窗口函数(MySQL 8.0及以上版本支持)

用ROW_NUMBER()窗口函数给每个用户的订单按日期排序,取排序第一的行就是最早订单的对应数据:

SELECT customer_id, order_date AS first_date, customer_pref_delivery_date
FROM (
    SELECT 
        customer_id, 
        order_date, 
        customer_pref_delivery_date,
        ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date ASC) AS rn
    FROM Delivery
) t
WHERE rn = 1
ORDER BY customer_id;

方法3:开启ONLY_FULL_GROUP_BY模式

开启这个模式后,MySQL会严格遵循SQL标准,不允许分组查询中出现既不在GROUP BY子句、也未被聚合函数处理的列,直接报错提醒语法问题,从根源避免随机取值的情况。执行以下命令开启:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:25:04