Оптимизация запроса с двумя столбцами MAX в одной таблице - PullRequest
1 голос
/ 13 января 2012

Мне нужно оптимизировать запрос ниже

 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 имеет столбцы StatusID, StatusName, StatusStageNumber(int)
    • CargoStatus имеет столбцы ID, StatusID (FK StatusMaster StatusID column), Date

Есть ли другой способ получшенаписания этого запроса.

Мне нужен последний статус для каждого груза (только одна запись на cargoID).

1 Ответ

6 голосов
/ 13 января 2012

Поскольку вы, похоже, используете SQL Server 2005 или более новую версию, вы можете использовать CTE с функцией оконной обработки 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), что я выбираю из CTE в SELECTзаявление после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...