如果我有这样的表:
Id StateId Name
1 1 a
2 2 b
3 1 c
4 1 d
5 3 e
6 2 f
我想选择如下:
Id StateId Name
4 1 d
5 3 e
6 2 f
例如,Ids 1,3,4具有stateid 1.因此选择具有最大Id的行,即4。
答案 0 :(得分:8)
; WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY STATEID ORDER BY ID DESC) AS RN
)SELECT ID, STATEID, NAME FROM CTE WHERE RN = 1
答案 1 :(得分:2)
免责声明:我在OP指定实际数据库之前给出了这个答案,因此避免使用窗口函数。有关可能更合适的答案,请参阅上面@Tanjim的回复。
这是一个使用连接的选项,它应该适用于大多数RDBMS。
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT StateId, MAX(Id) AS Id
FROM yourTable
GROUP BY StateId
) t2
ON t1.StateId = t2.StateId AND
t1.Id = t2.Id
答案 2 :(得分:2)
以下使用子查询,查找每个状态的最大ID。然后,WHERE
子句仅包含来自该子查询的ID的行。
SELECT
[Id], [StateID], [Name]
FROM
TABLENAME S1
WHERE
Id IN (SELECT MAX(Id) FROM TABLENAME S2 WHERE S2.StateID = S1.StateID)
答案 3 :(得分:1)
您可以使用ROW_NUMBER()+ TOP 1 WITH TIES:
SELECT TOP 1 WITH TIES
Id,
StateId,
[Name]
FROM YourTable
ORDER BY ROW_NUMBER() OVER (PARTITION BY StateId ORDER BY Id DESC)
输出:
Id StateId Name
4 1 d
6 2 f
5 3 e