SQL会根据另一列中的重复项查找一个列的最大值

时间:2019-01-24 18:48:59

标签: sql sql-server tsql

我有一个有趣的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行,但没有重复的{{1 }}是我正在尝试获取目录的最新版本。

我尝试了一些使用max的失败解决方案,以及一些没有运气的自联接查询。最终的解决方案将需要输入CatalogID(单独的表格)并返回所需的结果。我将做一些表连接来获得该部分,并认为我可以处理很多,但我很难从上述结果中返回正确/最大值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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以在子选择中使用GROUP BY上的CatalogID使用以下内容来获得最高的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

答案 1 :(得分:1)

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

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