求助:编写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
相关产品推荐
相关产品推荐

