微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL:根据最新日期选择多个字段,并使用一个唯一字段

如何解决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 举报,一经查实,本站将立刻删除。