求助编写:基于最新日期筛选唯一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
相关产品推荐
相关产品推荐

