在 SQL 服务器中过滤分区

Filter with partition over in SQL Server

这是我想要的

select 
    *,  
    rank() over (partition by col_a order by col_b) as some_rank 
from 
    table_A
where 
    some_rank = 1

显然,这是行不通的。我可以使用 CTE 或 temp table 来获得我想要的东西,但我想知道是否可以一次完成所有操作(没有 CTE 或 temp table)。像 havinggroup by

您可以将 top (1)ties 子句一起使用:

select top (1) with ties ta.*
from table_A ta
order by rank() over (partition by col_a order by col_b);

唯一遗憾的是,您无法过滤掉大于 1 的行,这会降低性能。

你可以用这种老式的方法

SELECT * 
FROM 
    (
    select 
        *,  
        rank() over (partition by col_a order by col_b) as some_rank 
    from 
        table_A
    ) T
WHERE some_rank = 1