用于查找订单最后一个事件状态的 SQL 查询

kod*_*kod 5 sql sql-server-2008

我有两个表(在 SQL Server 数据库中)如下:

TblO​​rders
OrderID (PK)
(更多字段)

TblEvents
EventID (PK)
OrderID (FK)(链接到 TblOrders 的 OrderID)
EventDate
状态

TblEvents 中的每个事件都属于 TblOrders 中的一个订单,每个事件都有一个日期和一个“状态”(一个数字代码)。一个订单可能有多个事件(至少一个)。

我需要一个 SQL 查询,为 TblOrders 中的每个 OrderID 查找其所有事件中最新事件的状态。例如:

输入表:

订单  
==========
 订单号
       1
       2
       3

表事件  
==========
 EventID OrderID EventDate 状态  
       1 1 01/02/2011 4
       2 1 02/02/2011 2
       3 2 03/02/2011 2
       4 3 03/02/2011 3
       5 2 01/02/2011 1

查询结果:

订单 ID 状态
      1 2
      2 2
      3 3

(OrderID 2 具有状态 2,因为它有两个事件,3 和 5,其中最新的是具有状态 2 的事件 3。)

我希望我已经清楚地解释了自己。我已经尝试编写查询很长时间,但找不到解决方案,因此欢迎任何帮助或提示。

Clo*_*eto 7

select a.OrderID, e.Status
from (
   select o.OrderID, max(e.EventDate) latestDate
   from TblOrders o
   inner join TblEvents e on o.OrderID = e.OrderID
   group by o.OrderID
   ) a
inner join TblEvents e on e.OrderID = a.OrderID
where e.EventDate = a.latestDate
Run Code Online (Sandbox Code Playgroud)

  • @AhmadIbrahim:在 Sql Server 中不可能,或者至少在十年前,不可能在同一个表表达式中按 id 分组最大日期和状态,因此需要子查询。但你是对的,订单表不是必需的。我一定是很匆忙地回答了。 (2认同)