2012-01-13 66 views
1

我需要優化以下查詢在同一個表優化有兩個MAX列查詢

SELECT 
    Id, -- identity 
    CargoID, 
    [Status] AS CurrentStatus 
FROM  
    dbo.CargoStatus 
WHERE 
    id IN (SELECT TOP 1 ID 
      FROM dbo.CargoStatus CS 
      INNER JOIN STD.StatusMaster S ON CS.ShipStatusID = S.SatusID 
      WHERE CS.CargoID=CargoStatus.CargoID 
      ORDER BY YEAR([CS.DATE]) DESC, MONTH([CS.DATE]) DESC, 
        DAY([CS.DATE]) DESC, S.StatusStageNumber DESC) 

有兩個表

  1. CargoStatus,並且
  2. StatusMaster

    • Statusmaster有012列
    • CargoStatus有列ID, StatusID (FK StatusMaster StatusID column), Date

有沒有寫這個查詢的任何其他更好的辦法。

我想要每個貨物的最新狀態(每個cargoID只有一個條目)。

回答

6

既然你似乎是使用SQL Server 2005或更高版本,可以使用熱膨脹係數與ROW_NUMBER()窗函數:

;WITH LatestCargo AS 
(
    SELECT 
     cs.Id, -- identity 
     cs.CargoID, 
     cs.[Status] AS CurrentStatus 
     ROW_NUMBER() OVER(PARTITION BY cs.CargoID 
         ORDER BY cs.[Date], s.StatusStageNumber DESC) AS 'RowNum' 
    FROM 
     dbo.CargoStatus cs 
    INNER JOIN 
     STD.StatusMaster s ON cs.ShipStatusID = s.[StatusID] 
) 
SELECT 
    Id, CargoID, [Status] 
FROM 
    LatestCargo 
WHERE 
    RowNum = 1 

這CTE「分區」您的數據由CargoID,併爲每個分區, ROW_NUMBER函數發出連續數字,從1開始,並按Date DESC排序 - 因此最後一行得到RowNum = 1(對於每個CargoID),這是我在SELECT語句後從CTE中選擇的順序號。

+0

嗨@mar​​c_s將它返回每個cargoid只有一行。我試過但它不適合我 – Thakur 2012-01-13 09:54:42

+0

我只需要返回每個貨物的頂部(最新的狀態通過日期desc,stagenumber desc)行,但作爲整個表格不是一行 – Thakur 2012-01-13 10:07:50

+0

@AamodThakur:這將返回**一條魚子每個'CargoID' ** - 如果您有10個'CargoID'值 - 您將獲得10行。 – 2012-01-13 10:10:14

相關問題