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)
有两张桌子
CargoStatus,和 StatusMaster
Statusmaster 有专栏 StatusID, StatusName, StatusStageNumber(int)CargoStatus 有专栏 ID, StatusID (FK StatusMaster StatusID column), Date有没有其他更好的方法来编写此查询.
我想要每种货物的最新状态(每个只有一个条目cargoID).
由于您似乎使用的是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中选择的它.