【问题标题】:SQL Find Max of one Column based on Duplicate in anotherSQL根据另一列中的重复查找一列的最大值
【发布时间】:2019-01-24 18:48:59
【问题描述】:

我有一个有趣的 SQL 问题,我不确定最好的解决方法。如果 CatalogID 相等,我需要选择最大/最高 ID 号 (CatalogVersionID):

+------------------+-----------+----------------------+
| CatalogVersionID | CatalogID | CatalogVersionNumber |
+------------------+-----------+----------------------+
|              121 |       492 |                0.0.2 |
|              122 |       493 |                0.0.2 |
|              123 |       494 |                0.0.1 |
|              201 |       572 |                1.0.0 |
|              207 |       494 |                0.1.0 |
+------------------+-----------+----------------------+

所以,上面应该只为CatalogID = 494输出一行,它应该是CatalogVersionID = 207CatalogVersionNumber = 0.1.0的行,同时还返回其他3行没有重复的CatalogID我正在尝试获取目录的最新版本。

我尝试了一些使用 max 的失败解决方案,以及一些没有运气的自连接查询。最终的解决方案需要输入GroupID(单独的表)并返回所需的结果。我会加入一些表格来获得那部分,并且认为我可以处理这么多,我只是无法从上述结果中返回正确/最大 CatalogVersionID

期望的输出:

+------------------+-----------+----------------------+
| CatalogVersionID | CatalogID | CatalogVersionNumber |
+------------------+-----------+----------------------+
|              121 |       492 |                0.0.2 |
|              122 |       493 |                0.0.2 |
|              201 |       572 |                1.0.0 |
|              207 |       494 |                0.1.0 |
+------------------+-----------+----------------------+

这是我尝试过的,只能获得整个结果集的最大值 CatalogVersionID(这显示了正在连接的其他表):

select cv.*
From CatalogBuilder.CatalogVersion cv
JOIN(select max(c.CatalogVersionID) as max_id
        from [CatalogBuilder].[CatalogVersion] c
        inner join [CatalogBuilder].[Catalog] cat on c.CatalogID = cat.CatalogID
        inner join [CatalogBuilder].[Group] g on g.GroupID = cat.GroupID
        where g.GroupID = 157) 
b on b.max_id = cv.CatalogVersionID

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以在子选择中使用GROUP BY 上的GROUP BY 来获得最高的CatalogVersionID。使用额外的INNER JOIN,您可以选择所有需要的行:

    SELECT t1.* 
    FROM table_name t1 INNER JOIN (
        SELECT CatalogID, MAX(CatalogVersionID) AS CatalogVersionID 
        FROM table_name
        GROUP BY CatalogID
    ) t2 ON t1.CatalogID = t2.CatalogID 
        AND t1.CatalogVersionID = t2.CatalogVersionID
    

    演示: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=3d92a5630c71aebb79d3562c9bf8c2dd

    【讨论】:

    • 不,这实际上非常适合我的需求。抱歉,如果不清楚@digital.aaron。你是救生员 Sebastian Brosch!
    【解决方案2】:

    这是表格形式的测试数据:

    CREATE TABLE #test (CatalogVersionID INT,  CatalogID INT, CatalogVersionNumber VARCHAR(20))
    
    INSERT INTO #test
    (
        CatalogVersionID
        ,CatalogID
        ,CatalogVersionNumber
    )
    VALUES
    (121,492,'0.0.2'),
    (122,493,'0.0.2'),
    (123,494,'0.0.1'),
    (201,572,'1.0.0'),
    (207,494,'0.1.0')
    

    我们可以使用 CTE 对每个 CatalogId 分组中的行进行编号,按 CatalogVersionID 降序排列。然后我们只输出行号 = 1 的那些行。

    ;WITH cte AS
    (
        SELECT 
            t.CatalogVersionID
            , t.CatalogID
            , t.CatalogVersionNumber 
            , rn = ROW_NUMBER() OVER (PARTITION BY t.CatalogID ORDER BY t.CatalogVersionID DESC)
        FROM #test t
    )
    SELECT * 
    FROM cte
    WHERE rn = 1
    

    输出是:

    CatalogVersionID    CatalogID   CatalogVersionNumber    rn
    121                 492         0.0.2                   1
    122                 493         0.0.2                   1
    207                 494         0.1.0                   1
    201                 572         1.0.0                   1
    

    【讨论】:

    • 这看起来也可以。非常感谢您的意见和帮助亚伦!
    猜你喜欢
    • 2021-07-25
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多