Выбор максимального номера версии из двух столбцов - PullRequest
3 голосов
/ 16 ноября 2010

Это относится к другому вопросу, который я задавал ранее. Вы можете лучше понять это, если быстро его отсканируете. Версия Числа с плавающей запятой, десятичные или двойные

У меня есть два столбца и иностранный в таблице базы данных. A [Версия] столбец и [Редакция] столбец. Они связаны с номерами версий. например. Версия 1, редакция 2 = v1.2

Что мне нужно сделать, так это получить максимальный номер версии для определенного внешнего ключа.

Вот что у меня есть:

SELECT f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] AND
 f.[Revision] = x.[Revision]

В основном, схватив максимум и присоединившись к себе. Это не работает, потому что, если у меня есть номера версий 1.1, 1.2 и 2.0, максимальное значение, которое я возвращаю из вышеприведенного запроса, составляет 2.2 (которого не существует).

Что мне нужно сделать (я думаю), это выбрать максимум [Версия], а затем выбрать максимум [Редакция] для этой [Версии], но я не совсем понимаю, как это сделать.

Любая помощь, предложения, вопросы приветствуются.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Вы можете изменить его на

SELECT  f.[pkFileID]
        ,x.[fkDocumentHeaderID]
        ,f.[fkDocumentID]
        ,x.[Version]
        ,x.[Revision]
        ,f.[FileURL]
        ,f.[UploadedBy]
        ,f.[UploadedDate]
FROM    (
          SELECT  docs.[fkDocumentHeaderID]
                  ,MAX([Version] * 100000 + [Revision]) AS [VersionRevision] 
          FROM    [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
                  INNER JOIN dbo.tbl_Documents docs 
                    ON [fkDocumentID] = [pkDocumentID]
          GROUP BY
                  docs.[fkDocumentHeaderID]
        )AS x
        INNER JOIN dbo.tbl_DocumentFiles f 
          ON f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] 
             AND f.[Version] * 100000 + f.[Revision] = x.[VersionRevision] 

Идея состоит в том, чтобы умножить версию на достаточно большую константу, чтобы она никогда не сталкивалась с ревизией (я взял 100.000, но подойдет любое значение).

После этого ваш JOIN делает то же самое для извлечения записи.

0 голосов
/ 16 ноября 2010

Нижеследующее должно работать для извлечения верхней ревизии.

SELECT TOP 1 f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     -- Comment this out ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] 
ORDER BY x.Revision DESC

А именно, оно извлекает только записи, использующие максимальную версию, в таблицу x.Затем он упорядочивает эти записи по редакции в порядке убывания и извлекает верхнюю часть группы.

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