如何解决SQL:根据最新日期选择多个字段,并使用一个唯一字段
我正在尝试编写sql语句以根据最近的日期选择唯一的部件号。 如果我只有PartNo和ReceiveDate这两个字段,我可以这样做:
"SELECT PartNo,Max(ReceiveDate) FROM Table GROUP BY PartNo;"
,这将返回唯一的部件号和最新日期。
问题是我还想包含vendorName和Qty字段(但我只希望PartNo是唯一的)。我尝试过:
"SELECT PartNo,vendorName,Qty,Max(ReceiveDate) FROM Table GROUP BY PartNo;"
和
"SELECT PartNo,Max(ReceiveDate) FROM Table GROUP BY PartNo,Qty;"
我理解为什么这两个SELECT语句错误,第一个不运行,因为vendorName和Qty不在GROUP BY子句或聚合函数的一部分中,而第二个则根据零件号,供应商名称和数量,而不仅仅是零件号。
如果有人可以帮助我编写正确的sql语句,将不胜感激。我使用的Microsoft Access使用的Jet sql与T-sql非常相似。
解决方法
如果您的意思是,您不在乎Vendorname和Qty来自哪一行(每个partNo),那么您可以简单地使它们具有一些聚合函数:
SELECT PartNo,max(VendorName) as VendorName,max(Qty) as Qty,Max(ReceiveDate) as ReceiveDate
FROM [Table]
GROUP BY PartNo;
可能更好的方法是从具有最后接收日期的行中获取那些VendorName和Qty(我假设分组每个PartNum返回1个日期):
select t.PartNo,t.VendorName,t.Qty,tmp.LastDate as ReceiveDate
from (SELECT PartNo,Max(ReceiveDate) as lastDate
FROM [Table]
GROUP BY PartNo) tmp
inner join [Table] t on t.PartNo = tmp.PartNo
where t.ReceiveDate = tmp.lastDate;
我认为,没有人会真正将表命名为[Table]。
,我建议一个相关的子查询:
SELECT t.*
FROM Table as t
WHERE t.ReceiveDate = (SELECT MAX(t2.ReceiveDate)
FROM Table as t2
WHERE t2.PartNo = t.PartNo
);
尤其是,这可以利用(PartNo,ReceiveDate)
上的索引。
尝试使用交叉表查询:
SELECT DISTINCT X.PartNo,X.MaxDate,Y.VendorName,Y.Qty FROM
(SELECT PartNo,Max(ReceiveDate)MaxDate FROM Table GROUP BY PartNo)X,(SELECT PartNo,VendorName,Qty From Table)Y
WHERE X.PartNo=Y.PartNo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。