如何使用SQL查询各客户的倒数第二笔订单日期
查询每个客户的倒数第二笔订单日期
现有数据
Customers表包含字段:客户ID(C.id)、产品类型(product)、订单日期(Order_Date),原始数据如下:
| C.id | product | Order_Date |
|---|---|---|
| 1 | pens | 2023-01-09 |
| 2 | books | 2022-10-01 |
| 2 | books | 2022-07-09 |
| 3 | toys | 2022-06-10 |
| 3 | books | 2022-05-05 |
| 3 | books | 2022-04-04 |
错误尝试
尝试使用以下SQL查询:
SELECT c.id,product, min(Order_date) FROM customers Where product = books Group by c.id;
得到的错误结果:
| C.id | product | Order_Date |
|---|---|---|
| 2 | books | 2022-10-01 |
| 3 | books | 2022-05-05 |
期望结果
需要获取每个客户的倒数第二笔订单日期,正确结果应为:
| C.id | product | Order_Date |
|---|---|---|
| 2 | books | 2022-07-09 |
| 3 | toys | 2022-06-10 |
正确SQL实现
使用窗口函数ROW_NUMBER()按客户分组,订单日期倒序排序,筛选排序序号为2的记录(即倒数第二笔订单):
SELECT id, product, Order_Date FROM ( SELECT C.id, product, Order_Date, ROW_NUMBER() OVER (PARTITION BY C.id ORDER BY Order_Date DESC) AS rn FROM customers ) t WHERE rn = 2;
逻辑说明
- 内层查询通过
PARTITION BY C.id按客户分组,ORDER BY Order_Date DESC将每个客户的订单按日期从新到旧排序,ROW_NUMBER()为每条记录分配序号,最新订单序号为1,倒数第二订单序号为2。 - 外层查询筛选序号为2的记录,直接得到每个客户的倒数第二笔订单数据。
- 该方法适配支持窗口函数的主流数据库(如MySQL 8+、PostgreSQL、SQL Server等)。
内容的提问来源于stack exchange,提问作者Vedant Agarwal
相关产品推荐
相关产品推荐

