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

MySQL按客户分组筛选指定时间段内首次预约的客户

解决方案:查询指定日期范围内首次预约的客户

这个需求核心是要找出首次预约恰好落在指定日期区间内的客户,同时显示他们在该区间内的预约记录。下面提供两种实用的SQL写法:

方法一:先计算所有客户的首次预约日期,再筛选匹配

这种方法先通过子查询统计每个客户的最早预约日期,再关联原表筛选出符合条件的记录:

SELECT a.*
FROM appointments a
JOIN (
    -- 子查询:获取每个客户的首次预约日期
    SELECT client_id, MIN(date) AS first_appointment_date
    FROM appointments
    GROUP BY client_id
) AS client_first_dates 
ON a.client_id = client_first_dates.client_id
-- 筛选条件:预约日期在目标范围内,且该客户的首次预约也在这个范围
WHERE a.date BETWEEN '2018-02-03' AND '2018-02-07'
AND client_first_dates.first_appointment_date BETWEEN '2018-02-03' AND '2018-02-07';

针对你的测试数据,执行这条SQL后会返回client_id为1016的那条记录(id=11),完全符合预期。

方法二:直接筛选区间内记录,再验证是否为首次预约

这种写法先缩小范围到目标区间内的预约,再通过分组和HAVING子句验证该客户的首次预约是否就在此区间:

SELECT client_id, MIN(date) AS first_appointment_date, notes
FROM appointments
WHERE date BETWEEN '2018-02-03' AND '2018-02-07'
GROUP BY client_id
-- 验证:该客户在区间内的最早预约,等于他所有预约中的最早日期
HAVING MIN(date) = (SELECT MIN(date) FROM appointments a WHERE a.client_id = appointments.client_id);

这条语句会直接返回符合条件的客户及其首次预约信息,结果同样是client_id=1016的相关数据。

两种方法都能实现需求,你可以根据实际表的大小和性能要求选择:如果表数据量很大,方法一的子查询只需要执行一次统计,可能效率更高;方法二逻辑更直观,适合数据量较小的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:44:05