【问题标题】:Selecting Maximum Version Number from Two Columns从两列中选择最大版本号
【发布时间】:2010-11-16 14:09:30
【问题描述】:

这与我之前提出的另一个问题有关。如果您快速浏览它,您可能会对此有更好的理解。 Version Numbers float, decimal or double

我在数据库表中有两个列和一个外部列。 [Version] 列和 [Revision] 列。这些与版本号有关。 例如版本 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.11.22.0,我从上述查询返回的最大值是 2.2(不存在)。

我需要做的(我认为)是选择最大 [Version],然后为该 [Version] 选择最大 [Revision],但我不知道该怎么做。

欢迎任何帮助、建议、问题。

谢谢。

【问题讨论】:

    标签: sql sql-server-2005 version-control version-numbering


    【解决方案1】:

    你可以改成

    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 会执行相同的操作来检索记录。

    【讨论】:

      【解决方案2】:

      以下内容应该可以提取最高修订版。

      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 中。然后它以降序通过修订对这些记录进行排序,并提取最顶部的记录。

      【讨论】:

      • 此查询仅返回 1 个结果,而不是所有外键的顶部结果。不是我想要的,但感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2021-02-04
      相关资源
      最近更新 更多