[英]SQL select top if columns are same
如果我有这样一个表:
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
例如,ID 1、3、4的状态ID为1。因此,请选择具有最大ID(即4)的行。
; 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
免责声明:我在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
以下使用子查询来查找每个状态的最大Id。 然后, WHERE
子句仅包含具有该子查询的ID的行。
SELECT
[Id], [StateID], [Name]
FROM
TABLENAME S1
WHERE
Id IN (SELECT MAX(Id) FROM TABLENAME S2 WHERE S2.StateID = S1.StateID)
您可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.