当前位置:  开发笔记 > 数据库 > 正文

SQL语句帮助 - 为每个客户选择最新订单

如何解决《SQL语句帮助-为每个客户选择最新订单》经验,为你挑选了3个好方法。

假设我有2个表:客户和订单.客户可以拥有多个订单.

现在,我需要向任何客户展示他最新的订单.这意味着如果客户有多个订单,则仅显示具有最新进入时间的订单.

这是我自己管理的程度:

SELECT a.*, b.Id
FROM Customer a INNER JOIN Order b ON b.CustomerID = a.Id
ORDER BY b.EntryTime DESC

这当然会返回所有拥有一个或多个订单的客户,首先显示每个客户的最新订单,这不是我想要的.此时我的思绪陷入了困境,所以我希望有人可以指出我正确的方向.

出于某种原因,我我需要在某个地方使用MAX语法,但它现在就让我失望了.

更新:在这里经过几个答案后(有很多!),我意识到我犯了一个错误:我的意思是任何客户都有他的最新记录.这意味着如果他没有订单,那么我就不需要列出他.

UPDATE2:修复了我自己的SQL语句,这可能不会导致其他人混淆.



1> Martin Brown..:

我不认为您确实想要使用MAX(),因为您不想对OrderID进行分组.你需要的是一个带有SELECT TOP 1的有序子查询.

select * 
from Customers 
    inner join Orders 
        on Customers.CustomerID = Orders.CustomerID
        and OrderID = (
            SELECT TOP 1 subOrders.OrderID 
            FROM Orders subOrders 
            WHERE subOrders.CustomerID = Orders.CustomerID 
            ORDER BY subOrders.OrderDate DESC
        )



2> Patrick Harr..:

虽然我看到你已经接受了答案,但我认为这个更直观:

select      a.*
           ,b.Id

from       customer a

inner join Order b
on         b.CustomerID = a.Id

where      b.EntryTime = ( select max(EntryTime)
                           from   Order
                           where  Id = b.Id
                         );

我必须通过执行计划来运行这样的事情以查看执行的差异,但是TOP函数在事后完成并且使用"order by"可能很昂贵,我相信使用max(EntryTime)将是运行此方法的最佳方式.



3> xahtep..:

这样的事情应该做到:

SELECT X.*, Y.LatestOrderId
FROM Customer X
LEFT JOIN (
  SELECT A.Customer, MAX(A.OrderID) LatestOrderId
  FROM Order A
  JOIN (
    SELECT Customer, MAX(EntryTime) MaxEntryTime FROM Order GROUP BY Customer
  ) B ON A.Customer = B.Customer AND A.EntryTime = B.MaxEntryTime
  GROUP BY Customer
) Y ON X.Customer = Y.Customer

假设同一客户的两个订单可能具有相同的EntryTime,这就是为什么MAX(OrderID)在子查询中使用该订单Y以确保每个客户仅发生一次。使用,LEFT JOIN是因为您说过要显示所有客户-如果他们没有任何订单,则LatestOrderId将为NULL

希望这可以帮助!

-

更新:-)仅显示有订单的客户:

SELECT A.Customer, MAX(A.OrderID) LatestOrderId
FROM Order A
JOIN (
  SELECT Customer, MAX(EntryTime) MaxEntryTime FROM Order GROUP BY Customer
) B ON A.Customer = B.Customer AND A.EntryTime = B.MaxEntryTime
GROUP BY Customer

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有