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

求助编写:基于最新日期筛选唯一PartNo并关联其他字段的SQL语句

解决Access中按最新日期获取唯一PartNo对应字段的问题

我完全懂你的需求——要给每个唯一的PartNo,找出它最新收货日期对应的VendorName和Qty,同时保证PartNo是唯一的对吧?你之前尝试的两种写法确实都有问题,咱们一步步来解决:

为什么之前的写法行不通?

  • 第一种写法SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo;:Access的Jet SQL严格遵循分组规则,非聚合字段必须出现在GROUP BY里,所以VendorName和Qty没在分组里就会报错。
  • 第二种写法SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo, VendorName, Qty;:这会把PartNo+VendorName+Qty的组合当成唯一键,结果就不是你要的“仅PartNo唯一”了。

适合Access的两种正确写法

方法1:子查询获取最大日期后关联原表

先通过子查询拿到每个PartNo的最新ReceiveDate,再把这个结果和原表关联,就能拿到对应日期的VendorName和Qty:

SELECT t.PartNo, t.VendorName, t.Qty, t.ReceiveDate
FROM YourTable t
INNER JOIN (
    SELECT PartNo, MAX(ReceiveDate) AS LatestDate
    FROM YourTable
    GROUP BY PartNo
) sub ON t.PartNo = sub.PartNo AND t.ReceiveDate = sub.LatestDate;

注意:如果同一个PartNo在同一天有多个收货记录(也就是同一个PartNo+LatestDate对应多条VendorName/Qty),这个查询会返回所有这些记录。如果要确保每个PartNo只返回一条,可以在子查询或者外层加额外的筛选逻辑(比如取最大的Qty,或者特定Vendor)。

方法2:用相关子查询筛选最新记录

这种写法更简洁,直接在WHERE子句里判断当前记录的ReceiveDate是该PartNo的最大值:

SELECT t.PartNo, t.VendorName, t.Qty, t.ReceiveDate
FROM YourTable t
WHERE t.ReceiveDate = (
    SELECT MAX(ReceiveDate)
    FROM YourTable
    WHERE PartNo = t.PartNo
);

和方法1一样,如果存在同一PartNo同一日期多条记录的情况,会返回多条。如果需要强制单条,可以结合TOP 1和ORDER BY,比如:

SELECT DISTINCT t.PartNo, 
    (SELECT TOP 1 VendorName FROM YourTable WHERE PartNo = t.PartNo ORDER BY ReceiveDate DESC) AS VendorName,
    (SELECT TOP 1 Qty FROM YourTable WHERE PartNo = t.PartNo ORDER BY ReceiveDate DESC) AS Qty,
    (SELECT MAX(ReceiveDate) FROM YourTable WHERE PartNo = t.PartNo) AS ReceiveDate
FROM YourTable t;

这两种写法都符合Access Jet SQL的语法,你可以根据自己的数据情况选择最合适的~

内容的提问来源于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 21:03:14