在 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)。像 having
和 group 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
这是我想要的
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)。像 having
和 group 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