Sql 选择每个客户';最近的一次购买

Sql 选择每个客户';最近的一次购买,sql,ms-access,Sql,Ms Access,在Microsoft Access 2010中,我想运行一个查询,只列出每个客户最近购买的产品。以下是迄今为止我掌握的SQL: SELECT ClientNumber, DateOfPurchase FROM ordersTable WHERE ClientNumber IN ( SELECT MAX(DateOfPurchase) FROM ordersTable GROUP BY ClientNumber ); 问题是这个查询没有返回任何数据,尽管它们是orders

在Microsoft Access 2010中,我想运行一个查询,只列出每个客户最近购买的产品。以下是迄今为止我掌握的SQL:

SELECT ClientNumber, DateOfPurchase  
FROM ordersTable WHERE ClientNumber IN (  
SELECT MAX(DateOfPurchase)  
FROM ordersTable  
GROUP BY ClientNumber  
);  

问题是这个查询没有返回任何数据,尽管它们是ordersTable中的相关数据。如何更改上述代码以使其正常工作?

通常,您可以通过将表连接到自身来解决此问题:

SELECT o.ClientNumber, o.DateOfPurchase  
FROM ordersTable o JOIN (
    SELECT MAX(DateOfPurchase) as MaxDateOfPurchase, ClientNumber
    FROM ordersTable  
    GROUP BY ClientNumber  
) t ON o.ClientNumber = t.ClientNumber AND o.DateOfPurchase = t.MaxDateOfPurchase
话虽如此,如果不选择任何其他字段,子查询将自行工作:

SELECT MAX(DateOfPurchase) as MaxDateOfPurchase, ClientNumber
FROM ordersTable  
GROUP BY ClientNumber  

编辑,如果您使用的是MS Access,在给列添加别名时,您可能需要关键字
AS

您的内部查询返回一个日期列表,然后您的外部查询尝试查找客户编号与这些日期匹配的订单。由于日期和客户编号永远不匹配,外部查询将不会返回任何数据。运行内部查询,然后查看“in”应该做什么,这就是您的问题;-)@hamza kubba击败了我:以表格格式填充样本数据和您的预期输出也将有助于更好地理解问题您的子查询在
SELECT
子句中缺少
AS
es.@sgedes在极少数情况下可能会出现问题,当用户使用与
通常相同的购买日期发出两个订单时大多数
RDBMS
都不需要别名字段或表。话虽如此,也许是MS Access的问题(我已经有一段时间没有使用过了!)@IlyaBursov——这一点很好——需要了解更多关于表模式和所需结果的信息:)@sgeddes的工作非常有魅力+答案是肯定的。另外,谢谢你帮助我学习。