如何查询指定日期后首次下单的客户列表?
获取首次下单时间符合指定条件的客户列表
订单表数据
| OrderID | CustomerID | OrderedDate |
|---|---|---|
| 1 | 1000 | 2024-02-27 20:00:00 |
| 2 | 2000 | 2024-02-28 23:00:00 |
| 3 | 3000 | 2024-02-28 23:01:00 |
| 4 | 1000 | 2024-02-29 23:01:00 |
| 5 | 4000 | 2024-02-29 23:02:00 |
需求说明
需要筛选出首次下单时间在指定日期(示例为2024-02-28 23:00:00)当天或之后的客户,示例中客户1000因首次下单早于指定日期需排除,最终结果为2000、3000、4000。
几种可行的SQL实现方法
方法1:GROUP BY聚合取最小下单日期
这是最简洁的实现方式,通过分组计算每个客户的最早下单时间,再筛选符合条件的记录:
SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING MIN(OrderedDate) >= '2024-02-28 23:00:00';
方法2:窗口函数标记首次订单
利用窗口函数为每个客户的订单按时间排序,筛选出首次下单的记录后再过滤日期:
WITH CustomerFirstOrders AS ( SELECT CustomerID, OrderedDate, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderedDate) AS OrderRank FROM Orders ) SELECT CustomerID FROM CustomerFirstOrders WHERE OrderRank = 1 AND OrderedDate >= '2024-02-28 23:00:00';
方法3:CROSS APPLY关联子查询
通过CROSS APPLY关联子查询获取每个客户的首次下单时间,再进行条件筛选:
SELECT DISTINCT o.CustomerID FROM Orders o CROSS APPLY ( SELECT MIN(OrderedDate) AS FirstOrderDate FROM Orders WHERE CustomerID = o.CustomerID ) fo WHERE fo.FirstOrderDate >= '2024-02-28 23:00:00';
期望查询结果
| CustomerID |
|---|
| 2000 |
| 3000 |
| 4000 |
内容的提问来源于stack exchange,提问作者FMFF
相关产品推荐
相关产品推荐

