如何编写SQL查询仅显示最后付款日期并剔除表中其他日期
实现每个商品仅保留最后付款日期记录的SQL查询
问题描述
编写SQL查询,从包含商品、付款日期、买家的表中,仅保留每个商品的最后付款日期对应的记录,剔除其他日期的记录。
示例原表数据
| ITEM | DATE | BUYER |
|---|---|---|
| BALL | AUGUST 5 | JOHN |
| BALL | AUGUST 9 | BOMA |
| KITE | JUNE 2 | KEAN |
| KITE | JUNE 4 | RAY |
期望结果
| ITEM | DATE | BUYER |
|---|---|---|
| BALL | AUGUST 9 | BOMA |
| KITE | JUNE 4 | RAY |
解决方案
方法1:使用窗口函数(推荐,适用于现代SQL数据库)
利用ROW_NUMBER()窗口函数按商品分组,对日期倒序排序后取每组第一条记录:
SELECT ITEM, DATE, BUYER FROM ( SELECT ITEM, DATE, BUYER, -- 按商品分组,日期倒序排序,给每条记录编号 ROW_NUMBER() OVER ( PARTITION BY ITEM ORDER BY STR_TO_DATE(DATE, '%M %d') DESC ) AS row_num FROM payments -- 替换为你的实际表名 ) ranked_data WHERE row_num = 1;
方法2:子查询关联(兼容旧版数据库)
先通过子查询找到每个商品的最大付款日期,再关联原表获取对应记录:
SELECT p.ITEM, p.DATE, p.BUYER FROM payments p INNER JOIN ( SELECT ITEM, MAX(STR_TO_DATE(DATE, '%M %d')) AS latest_date FROM payments GROUP BY ITEM ) latest_dates ON p.ITEM = latest_dates.ITEM AND STR_TO_DATE(p.DATE, '%M %d') = latest_dates.latest_date;
注意事项:日期格式转换
由于示例中日期是字符串格式(如AUGUST 5),需要转换为日期类型才能正确比较大小,不同数据库的转换函数不同:
- MySQL/MariaDB:
STR_TO_DATE(DATE, '%M %d') - PostgreSQL:
TO_DATE(DATE, 'FMMonth DD') - SQL Server:
CONVERT(DATE, DATE, 107)
如果你的日期字段本身就是DATE类型,直接使用字段名即可,无需转换。
内容的提问来源于stack exchange,提问作者id kabasa
相关产品推荐
相关产品推荐

