如何用MySQL查询特定年月首次下单的企业(客户)?
如何筛选首次下单在指定年月的店铺首单记录
我们定义新开业店铺为首次下单在特定年月的企业——比如Store123在2023年1月首次下单且此前无任何订单,就属于这类店铺。现有Orders表数据如下:
| Company | Order ID | Close Date | Amount |
|---|---|---|---|
| Store123 | 00018972 | 2023-04-26 | 2880 |
| StoreABC | 00017237 | 2023-01-05 | 3720 |
| Store123 | 00018242 | 2023-01-03 | 4280 |
| StoreABC | 00017123 | 2022-06-05 | 3231 |
期望查询结果为Store123的首单记录:Store123 | 00018242 | 2023-01-03 | 4280
你写的SQL无法运行,问题主要有三点:
- WHERE子句不能直接使用聚合函数
MIN(Close Date),聚合函数需搭配GROUP BY放在HAVING子句中 GROUP BY 'Company'里的单引号会把Company当成字符串常量,而不是字段名,正确写法是GROUP BY CompanySELECT *和GROUP BY搭配不符合SQL规范,且你需要的是具体的首单记录,不是分组后的聚合结果
以下是两种可行的解决方案:
方案一:用窗口函数标记首单
利用ROW_NUMBER()窗口函数给每个企业的订单按下单日期排序,标记出首单后,筛选首单日期在2023年1月的记录:
SELECT Company, `Order ID`, `Close Date`, Amount FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY Company ORDER BY `Close Date`) AS order_rank FROM Orders ) ranked_orders WHERE order_rank = 1 AND `Close Date` BETWEEN '2023-01-01' AND '2023-01-31';
方案二:子查询筛选符合条件的企业后关联
先找出每个企业的首次下单日期,筛选出首次下单在2023年1月的企业,再关联原表获取对应的首单记录:
SELECT o.* FROM Orders o INNER JOIN ( SELECT Company, MIN(`Close Date`) AS first_order_date FROM Orders GROUP BY Company HAVING MIN(`Close Date`) BETWEEN '2023-01-01' AND '2023-01-31' ) company_first_orders ON o.Company = company_first_orders.Company AND o.`Close Date` = company_first_orders.first_order_date;
这两种方法都能得到你想要的结果,窗口函数的写法更简洁,适配大多数现代数据库(如MySQL 8+、PostgreSQL、SQL Server等)。
内容的提问来源于stack exchange,提问作者ndomitable
相关产品推荐
相关产品推荐

