代码之家  ›  专栏  ›  技术社区  ›  LogisticsRay

选择列的最后一个实例,但用CASE比较不同的字段

  •  0
  • LogisticsRay  · 技术社区  · 2 年前

    我需要3列:TOrder中的订单号、最后一个实例(最大)OrderEvent ID,我想将case/when应用于另一列(ordereventtypeid)。

    订单号和最后一个实例有效。然而,为了让第三栏发挥作用,我已经筋疲力尽了。本质上,我想拉取最后一个实例 OrderEventId 对于每一个 OrderId ,但随后申请 CASE/WHEN 到那一排。下面发生的事情是,所有这些国家都出现了“T&R”延迟,而不仅仅是最后一个国家 OrderEventTypeID 是“107”。

    SELECT 
       TOrder.OrderNumber
       ,(SELECT MAX (OrderEventID) FROM TOrderEvent
        WHERE TOrderEvent.OrderID = TOrder.OrderID
        ) AS 'Delay SubQ'
       ,CASE 
            WHEN EXISTS (SELECT MAX (OrderEventID) FROM TOrderEvent
                         WHERE TOrderEvent.OrderID = TOrder.OrderID
                           AND TOrderEvent.OrderEventTypeID IN (107)) 
                THEN 'T&R Delay'
                ELSE ''
        END AS 'Delay Case'
    FROM 
        TOrder
    WHERE 
        TOrder.CustomerId IN (14758, 25167)
        AND TOrder.OrderDate >= '1/1/2024'
        AND TOrder.OrderStatusID NOT IN (1206, 1208)
    

    我尝试过使用子查询、联接等。联接时 TOrderEvent 并使用 MAX ON TOrderEvent.OrderEventID ,我为每个ordereventid得到一行,而不是每个orderid只有最后一个ordereventid实例的一行。

    我使用的是带有Azure托管SQL即服务的ExpressRoute 19.0.20209。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Varun Malhotra    2 年前

    试试这个

    SELECT 
        TOrder.OrderNumber,
        oe.MaxOrderEventID AS [Delay SubQ],
        CASE 
            WHEN oe.OrderEventTypeID = 107 THEN 'T&R Delay'
            ELSE ''
        END AS [Delay Case]
    FROM 
        TOrder
    CROSS APPLY
        (
            SELECT TOP 1 
                TOrderEvent.OrderEventID AS MaxOrderEventID,
                TOrderEvent.OrderEventTypeID
            FROM 
                TOrderEvent
            WHERE 
                TOrderEvent.OrderID = TOrder.OrderID
            ORDER BY 
                TOrderEvent.OrderEventID DESC
        ) oe
    WHERE 
        TOrder.CustomerId IN (14758, 25167)
        AND TOrder.OrderDate >= '2024-01-01'
        AND TOrder.OrderStatusID NOT IN (1206, 1208);
    
    推荐文章