如何在MySQL中筛选18个月未下单的唯一客户(按邮箱去重)
筛选过去18个月未下单的客户(MySQL)
要实现按邮箱去重,找出过去18个月完全没有下单记录的客户,核心思路是先获取每个客户的最后下单日期,再判断该日期是否早于18个月前。以下是直接可用的SQL语句:
SELECT client_name, client_email FROM orders GROUP BY client_email, client_name HAVING MAX(order_date) < DATE_SUB(CURDATE(), INTERVAL 18 MONTH);
逻辑说明
- 分组去重:通过
GROUP BY client_email, client_name按客户邮箱(唯一标识)分组,确保每个客户只返回一条记录。 - 获取最后下单日期:用
MAX(order_date)提取每个客户的最新订单时间。 - 时间筛选:
DATE_SUB(CURDATE(), INTERVAL 18 MONTH)计算当前日期往前推18个月的时间点,只有最后下单日期早于这个时间点的客户,才会被筛选出来。
示例验证
针对你提供的订单表:
| order_id | client_name | client_email | order_date |
|---|---|---|---|
| 1 | Peter Pan | m1@mail.com | 2022-11-02 |
| 2 | John Doe | t1@mail.com | 2021-11-02 |
| 3 | Jane Doe | j1@mail.com | 2020-11-02 |
| 4 | Peter Pan | m1@mail.com | 2020-10-22 |
| 5 | Jane Doe | j1@mail.com | 2019-10-22 |
| 6 | John Doe | t1@mail.com | 2018-10-22 |
假设当前日期为2023-05-02,18个月前的时间点是2021-11-02:
- Peter Pan的最后下单日期是2022-11-02(晚于2021-11-02),排除;
- John Doe的最后下单日期是2021-11-02(等于时间点,不属于“未下单”范围),排除;
- Jane Doe的最后下单日期是2020-11-02(早于2021-11-02),符合条件。
最终查询结果为:
Jane Doe j1@mail.com
内容的提问来源于stack exchange,提问作者user10425889
相关产品推荐
相关产品推荐

