如果有一个表[a, b, c, d]
,我想准确选择那些max(a)
c
的行
即。 a
= select max(a) from table group by c
最有效的方法是什么?我可以使用分区子句等吗?
答案 0 :(得分:2)
在现实世界中,几乎任何时候都存在一个线索,一个问题的特殊性,可以推测对你有利。
你的问题虽然是一个理想的案例,但没有特别之处。此查询将完全扫描表格,然后进行一些排序以找到最大值a:
select a,b,c,d
from(
select
a,
b,
c,
d,
row_number() over (partition by c order by a desc) as rnk_in_group_of_c
from table
)
where rnk_in_group_of_c = 1;
此查询比使用子查询查找max更好,因为它可能导致多个完整扫描,不需要的嵌套循环或其他性能问题。
请注意,如果您希望所有具有最大a的行(即,有两个相等的最大行),则应使用dense_rank()
函数而不是row_number()
答案 1 :(得分:1)
你试过keep (dense_rank first
这对我有多大帮助,而且表现可以好很多。
select
max(a) a,
max(b) keep (dense_rank first order by a desc) b,
c,
max(d) keep (dense_rank first order by a desc) d
from table
group by c
答案 2 :(得分:0)
可以在分区后添加可选的order by:
SELECT max(a) OVER (PARTITION BY c) max_c FROM...