SQL查询组按最高版本号

时间:2014-07-01 11:35:56

标签: sql sql-server

我正在尝试编写一个SQL Server查询来为每个不同的ColumnId提取具有最高'Revision'编号的行。

例如,如果我有一个数据集,如:

Id  ColumnId  Revision
------------------------
1       1         1
2       1         2
3       1         3
4       2         1
5       2         2
6       2         3
7       2         4

我想要的结果如下:

Id  ColumnId  Revision
------------------------
3       1        3
7       2        4

我尝试使用以下SQL语句:

SELECT Id, ColumnId, MAX(Revision) As Revision from Bug 
GROUP BY ColumnId 

如果我从上面的查询中删除了Id,它会部分返回我需要的内容。但是我还需要Id列。

我在这里错过了什么让这个查询按预期工作?

修改 我从上面的数据集中得不到的一点是,特定ColumnId的最高版本号不一定具有最高的Id。

Id  ColumnId  Revision
------------------------
1       1         1
2       1         3 <- Note this has a higher revision number than row Id 3.
3       1         2 <- This has a lower revision number than row Id 2.
4       2         1
5       2         2
6       2         3
7       2         4

5 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER,例如使用common-table-expression(CTE):

WITH CTE AS
(
    SELECT Id, ColumnId, Revision, 
           RN = ROW_NUMBER() OVER (PARTITION BY ColumnId ORDER BY Revision DESC)
    FROM Bug 
)
SELECT Id, ColumnId, Revision 
FROM CTE 
WHERE RN = 1

Demo

答案 1 :(得分:3)

您可以使用子查询,然后使用内部联接返回ColumnId和MaxRevision,如下所示:

SELECT A.Id, A.ColumnId, A.Revision
from Bug A 
INNER JOIN
(SELECT ColumnId  MAX(Revision) As MaxRevision 
FROM BUG
GROUP BY ColumnId ) B ON
A.ColumnId = B.ColumnId AND
A.Revision = B.MaxRevision

答案 2 :(得分:2)

您可以通过多种方式获得所需内容。这是一种使用not exists的方法,通常表现得非常好:

select id, columnid, revision
from bug b
where not exists (select 1
                  from bug b2
                  where b2.columnid = b.columnid and b2.revision > b.revision
                 );

答案 3 :(得分:2)

试试这个:

SELECT b.Id, b.ColumnId, b.Revision from Bug b 
INNER JOIN
(SELECT ColumnID, MAX(Revision) as 'Revision' from Bug GROUP BY ColumnID) m
ON b.ColumnId = m.ColumnId AND b.Revision = m.Revision

答案 4 :(得分:0)

试试这个:

SELECT    MAX(Id) AS ID, ColumnId, MAX(Revision) AS Revision
FROM      Bug 
GROUP BY  ColumnId