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

时间:2011-03-02 15:35:58

标签: sql sql-server-2008

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

  

TblOrders
  OrderID(PK)
  (更多领域)

     

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

TblEvents中的每个事件都属于TblOrders中的订单,每个事件都有一个日期和一个'status'(一个数字代码)。订单可能包含多个事件(至少一个)。

我需要一个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

查询结果:

OrderID Status
      1      2
      2      2
      3      3

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

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

SELECT TblORDER.ORDERID,MAX(tblEvent.EventDate),tblEvent.Status FROM TblOrder INNER JOIN tblEvent ON tblEvent.OrderID = tbOrder.ORDERID GROUP BY TblORDER.ORDERID ......类似的东西?

答案 2 :(得分:0)

试试这个...

SELECT DISTINCT(OrderId) OrderId, Status 
FROM tblEvents   
ORDER BY EventDate

答案 3 :(得分:0)

select a.OrderID, a.Status
from TblEvents a
where a.EventDate =
 (select max(b.EventDate)
  from TblEvents b
  where b.OrderId = a.OrderID)

请注意,如果订单的多个记录具有相同的最新EventDate,则会返回多行。

答案 4 :(得分:0)

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

使用CTE的相同查询:

;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

答案 5 :(得分:0)

Select * from TblEvents Where EventID IN(
  Select MAX(EventID) from TblEvents Group by OrderID
)
  • 现在加入您想要的任何表格