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

带连接的SQL max()

  •  0
  • nordscan  · 技术社区  · 8 年前

    我想请你帮忙

    Sql query 在那里我列出了所有订单,但我需要最后添加 OrderStatus 通过 OrderStatusID

    SELECT DISTINCT 
        a.OrderNr, 
        a.CompanyName, 
        max(a.OrderStatusID) AS 'xxx'
    
    FROM [NB].[dbo].[Npos] as a
    INNER JOIN [NB].[dbo].[Npos_Order_Status_Name] as b 
    ON 
    a.OrderStatusID = b.OrderStatusID
    
    GROUP BY  OrderNr, CompanyName
    

    在里面 [NB].[dbo].[Npos_Order_Status_Name]

    OrderStatusID | OrderStatusName
    --------------------------------
                0 | Start
                1 | Stop
                2 | Pause
    

    我试过了 inner join 但我做错了什么。

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Radim Bača    8 年前

    我相信这个查询会满足你的要求

    SELECT t.OrderNr, t.CompanyName, b.OrderStatusName
    FROM
    (
       SELECT 
        OrderNr, 
        CompanyName, 
        max(OrderStatusID) AS 'maxOrderStatus'
      FROM [NB].[dbo].[Npos]
      GROUP BY  OrderNr, CompanyName
    ) t
    JOIN [NB].[dbo].[Npos_Order_Status_Name] as b 
      ON  t.maxOrderStatus = b.OrderStatusID
    

    或使用窗口功能

    SELECT t.*
    FROM
    (     
        SELECT
            a.*,
            row_number() over (partition by OrderNr, CompanyName order by OrderStatusID desc) rn
        FROM [NB].[dbo].[Npos] as a
        INNER JOIN [NB].[dbo].[Npos_Order_Status_Name] as b 
          ON a.OrderStatusID = b.OrderStatusID
    ) t
    WHERE rn = 1
    

    然而,根据我的经验,在某些情况下,第二种变体可能会稍微慢一些。