我正在尝试编写一个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
答案 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
答案 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