繁体   English   中英

如果列相同,SQL选择顶部

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM