2012-01-13 84 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