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
相关产品推荐
相关产品推荐

