使用同一个表中的两个MAX列优化查询

Tha*_*kur 1 sql t-sql sql-server sql-server-2005 sql-server-2008

我需要优化以下查询

 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)
Run Code Online (Sandbox Code Playgroud)

有两张桌子

  1. CargoStatus,和
  2. StatusMaster

    • Statusmaster 有专栏 StatusID, StatusName, StatusStageNumber(int)
    • CargoStatus 有专栏 ID, StatusID (FK StatusMaster StatusID column), Date

有没有其他更好的方法来编写此查询.

我想要每种货物的最新状态(每个只有一个条目cargoID).

mar*_*c_s 6

由于您似乎使用的是SQL Server 2005或更高版本,因此可以使用具有ROW_NUMBER()窗口函数的CTE :

;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
Run Code Online (Sandbox Code Playgroud)

这个CTE"分区"你的数据CargoID,并且对于每个分区,该ROW_NUMBER函数分发顺序号,从1开始并按顺序排序Date DESC- 所以最新的行得到RowNum = 1(对于每个CargoID),这是我在SELECT语句中从CTE中选择的它.