如果列相同,则SQL select top

时间:2016-10-03 08:36:10

标签: sql sql-server sql-server-2012

如果我有这样的表:

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。

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