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

如何编写SQL查询仅显示最后付款日期并剔除表中其他日期

实现每个商品仅保留最后付款日期记录的SQL查询

问题描述

编写SQL查询,从包含商品、付款日期、买家的表中,仅保留每个商品的最后付款日期对应的记录,剔除其他日期的记录。

示例原表数据

ITEMDATEBUYER
BALLAUGUST 5JOHN
BALLAUGUST 9BOMA
KITEJUNE 2KEAN
KITEJUNE 4RAY

期望结果

ITEMDATEBUYER
BALLAUGUST 9BOMA
KITEJUNE 4RAY

解决方案

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:17