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

SQL查询以查找订单最后一个事件的状态,sql,sql-server-2008,Sql,Sql Server 2008,我有两个表(在SQL Server数据库中),如下所示: t领主 医嘱ID(主键) (更多字段) t等级 事件ID(主键) OrderID(FK)(链接到TblOrders的OrderID) 事件日期 地位 TblEvents中的每个事件都属于TblOrders中的一个订单,每个事件都有一个日期和一个“状态”(数字代码)。一个订单可能有多个事件(至少一个) 我需要一个SQL查询,为TblOrders中的每个OrderID查找所有事件中最新事件的状态。例如: 输入表: TblOrders ==

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

t领主
医嘱ID(主键)
(更多字段)

t等级
事件ID(主键)
OrderID(FK)(链接到TblOrders的OrderID)
事件日期
地位

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

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

输入表:

TblOrders ========= OrderID 1 2 3 TblEvents ========= EventID OrderID EventDate Status 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 领主 ========= 订单编号 1. 2. 3. T级 ========= 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 查询结果:

OrderID Status 1 2 2 2 3 3 医嘱ID状态 1 2 2 2 3 3 (OrderID 2的状态为2,因为它有两个事件3和5,最近一个事件是状态为2的事件3。)


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

选择TblORDER.ORDERID,MAX(tblEvent.EventDate),tblEvent.Status FROM TblORDER internal JOIN tblEvent.ORDERID=tbOrder.ORDERID组BY TblORDER.ORDERID。。。类似的东西?

试试这个

SELECT DISTINCT(OrderId) OrderId, Status 
FROM tblEvents   
ORDER BY EventDate
注意:如果一个订单的多条记录具有相同的最新EventDate,则这将返回多行

SELECT q.OrderID, q.Status
    FROM (SELECT e.OrderID, e.Status, 
                 ROW_NUMBER() OVER (PARTITION BY e.OrderID ORDER BY EventDate DESC) as RowNum)
              FROM tblEvents e) q
    WHERE q.RowNum = 1
使用以下命令执行相同的查询:

  • 现在把这个和你想要的任何表连接起来

在同一事件日期,一个订单id有多个不同状态的事件id,这种情况是否可能发生?如果是,选择层次结构是什么
SELECT q.OrderID, q.Status
    FROM (SELECT e.OrderID, e.Status, 
                 ROW_NUMBER() OVER (PARTITION BY e.OrderID ORDER BY EventDate DESC) as RowNum)
              FROM tblEvents e) q
    WHERE q.RowNum = 1
;WITH cteRowNum AS (
    SELECT e.OrderID, e.Status, 
           ROW_NUMBER() OVER (PARTITION BY e.OrderID ORDER BY EventDate DESC) as RowNum
        FROM tblEvents e
)
SELECT q.OrderID, q.Status
    FROM cteRowNum q
    WHERE q.RowNum = 1
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
Select * from TblEvents Where EventID IN(
  Select MAX(EventID) from TblEvents Group by OrderID
)