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

如何用MySQL查询特定年月首次下单的企业(客户)?

如何筛选首次下单在指定年月的店铺首单记录

我们定义新开业店铺为首次下单在特定年月的企业——比如Store123在2023年1月首次下单且此前无任何订单,就属于这类店铺。现有Orders表数据如下:

CompanyOrder IDClose DateAmount
Store123000189722023-04-262880
StoreABC000172372023-01-053720
Store123000182422023-01-034280
StoreABC000171232022-06-053231

期望查询结果为Store123的首单记录:
Store123 | 00018242 | 2023-01-03 | 4280

你写的SQL无法运行,问题主要有三点:

  • WHERE子句不能直接使用聚合函数MIN(Close Date),聚合函数需搭配GROUP BY放在HAVING子句中
  • GROUP BY 'Company'里的单引号会把Company当成字符串常量,而不是字段名,正确写法是GROUP BY Company
  • SELECT *和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:17:24