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

求助:编写Jet SQL语句获取基于最新ReceiveDate的唯一PartNo记录

解决Microsoft Access中按PartNo唯一取最新ReceiveDate记录的问题

针对你遇到的需求——筛选每个PartNo唯一且对应最新ReceiveDate的记录,当同一PartNo在同一日期有多条记录时返回任意一条,我给你几个适配Jet SQL的解决方案:

方法1:结合GROUP BY与关联查询

先通过GROUP BY获取每个PartNo的最新ReceiveDate,再关联原表,最后通过GROUP BY确保每个PartNo仅返回一条记录:

SELECT t.PartNo, t.Vendor, t.Qty, t.ReceiveDate
FROM (
    -- 先获取每个PartNo的最大接收日期
    SELECT PartNo, MAX(ReceiveDate) AS MaxReceiveDate
    FROM [Table]
    GROUP BY PartNo
) AS sub
INNER JOIN [Table] AS t 
    ON t.PartNo = sub.PartNo AND t.ReceiveDate = sub.MaxReceiveDate
GROUP BY t.PartNo, t.Vendor, t.Qty, t.ReceiveDate;

注意:Access要求SELECT子句中的所有非聚合字段必须出现在GROUP BY中,所以这里要把所有需要返回的字段都加入GROUP BY。对于你给出的测试数据,这个语句会返回100 | Bob | 2 | 2020/07/30或100 | Bob | 3 | 2020/07/30中的任意一条。

方法2:利用TOP 1子查询(依赖唯一主键)

如果你的表有唯一主键(比如ID),可以用TOP 1子查询直接筛选每个PartNo的最新日期下的任意一条记录:

SELECT DISTINCTROW t.*
FROM [Table] AS t
WHERE t.ID IN (
    SELECT TOP 1 t2.ID
    FROM [Table] AS t2
    WHERE t2.PartNo = t.PartNo
    ORDER BY t2.ReceiveDate DESC, t2.ID DESC -- 按接收日期倒序,再按主键倒序确保唯一
);

这里用ID作为辅助排序字段,保证在同一PartNo和ReceiveDate下只会选中一条记录。如果没有主键,也可以用其他能区分记录的字段(比如Qty)来替代,但主键是最稳妥的选择。

方法3:在原有语句基础上优化

针对你之前使用的语句,只需增加GROUP BY即可解决同一日期多条记录的问题:

SELECT t.*
FROM [Table] AS t 
WHERE t.ReceiveDate = (
    SELECT MAX(t2.ReceiveDate) 
    FROM [Table] AS t2 
    WHERE t2.PartNo = t.PartNo 
)
GROUP BY t.PartNo, t.Vendor, t.Qty, t.ReceiveDate;

这个改动通过GROUP BY强制每个PartNo仅保留一条记录,完美适配你的需求场景。

内容的提问来源于stack exchange,提问作者person1234568475

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:27:27