如何用SQL查询获取最新订购商品并剔除重复记录
问题描述
现有商品订购记录数据,示例中BOOK和PEN各有两条不同日期的订购记录,需编写SQL查询,仅保留每个商品最新的订购记录,去除重复的商品条目。
原始数据示例:
| ID | PRODUCT | ORDER_DATE |
|---|---|---|
| 1 | BOOK | 2023-10-01 |
| 2 | PEN | 2023-10-01 |
| 3 | BOOK | 2023-10-02 |
| 4 | PEN | 2023-10-03 |
预期结果:
| ID | PRODUCT | ORDER_DATE |
|---|---|---|
| 3 | BOOK | 2023-10-02 |
| 4 | PEN | 2023-10-03 |
解决方案
方法1:窗口函数法(推荐,适配多数现代数据库)
利用ROW_NUMBER()窗口函数按商品分组,按订购日期倒序排序,筛选每组的第一条(最新)记录:
SELECT ID, PRODUCT, ORDER_DATE FROM ( SELECT ID, PRODUCT, ORDER_DATE, ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ORDER_DATE DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
- 注:若同一商品存在多条相同最新日期的记录,
ROW_NUMBER()会随机保留一条;若需保留所有同日期的最新记录,可替换为RANK()或DENSE_RANK()。
方法2:分组关联法
先获取每个商品的最新订购日期,再关联原表提取对应记录:
SELECT t1.ID, t1.PRODUCT, t1.ORDER_DATE FROM your_table_name t1 JOIN ( SELECT PRODUCT, MAX(ORDER_DATE) AS latest_date FROM your_table_name GROUP BY PRODUCT ) t2 ON t1.PRODUCT = t2.PRODUCT AND t1.ORDER_DATE = t2.latest_date;
- 注:该方法会返回同一商品同一最新日期的所有记录,若需仅保留一条,可搭配
DISTINCT或额外排序条件。
方法3:NOT EXISTS子查询法
筛选出不存在同一商品、订购日期更晚的记录:
SELECT ID, PRODUCT, ORDER_DATE FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.PRODUCT = t1.PRODUCT AND t2.ORDER_DATE > t1.ORDER_DATE );
- 注:此方法同样会保留同一商品同一最新日期的所有记录,适合无需处理同日期多条记录的场景。
内容的提问来源于stack exchange,提问作者Basil Jacob
相关产品推荐
相关产品推荐

