如何使用MySQL SQL统计首次在7月下单的客户数量
如何统计首次在7月下单的客户数量
嘿,刚学MySQL遇到这种需求很正常,我来帮你一步步搞定这个查询!
核心需求是找出那些第一次下单就落在7月,并且7月之前完全没有下单记录的客户,下面给你两种常用的实现方法,你可以根据自己的习惯选择:
方法一:先计算每个用户的首次下单日期,再筛选
这种方法逻辑很直观,先算出每个用户最早的下单时间,再挑出那些首次下单在7月的用户:
SELECT COUNT(DISTINCT user_id) AS first_july_order_customers FROM ( -- 子查询:获取每个用户的首次下单日期 SELECT user_id, MIN(processing_at) AS first_order_date FROM your_table_name -- 替换成你的实际表名 GROUP BY user_id ) AS user_first_orders -- 筛选首次下单日期为7月的记录(记得替换年份) WHERE MONTH(first_order_date) = 7 AND YEAR(first_order_date) = 2024;
代码解释:
- 内层的子查询
user_first_orders通过GROUP BY user_id分组,再用MIN(processing_at)拿到每个用户最早的下单日期。 - 外层查询通过
MONTH()和YEAR()函数筛选出首次下单在目标7月的用户,最后用COUNT(DISTINCT user_id)统计去重后的用户数量。
方法二:用NOT EXISTS排除有历史订单的用户
这种方法直接从7月的订单出发,排除掉那些之前已经下过单的用户,剩下的就是首次在7月下单的客户:
SELECT COUNT(DISTINCT o1.user_id) AS first_july_order_customers FROM your_table_name o1 -- 先找到所有7月的订单 WHERE MONTH(o1.processing_at) = 7 AND YEAR(o1.processing_at) = 2024 -- 排除掉该用户在7月之前有过订单的情况 AND NOT EXISTS ( SELECT 1 FROM your_table_name o2 WHERE o2.user_id = o1.user_id AND o2.processing_at < '2024-07-01' );
代码解释:
- 主查询先锁定所有2024年7月的订单记录。
NOT EXISTS子句会检查当前用户是否在2024年7月1日之前有过订单,如果有就排除这个用户。- 最后用
COUNT(DISTINCT user_id)统计符合条件的用户总数。
注意事项
- 一定要把
your_table_name替换成你实际使用的数据表名称。 - 如果你的数据包含多个年份的订单,务必指定
YEAR()条件,不然会把所有年份里首次在7月下单的用户都统计进去。 - 因为你的
processing_at是date类型,所以MONTH()、YEAR()函数和日期比较都能正常工作,如果是datetime类型也同样适用。
内容的提问来源于stack exchange,提问作者Hitesh
相关产品推荐
相关产品推荐

