给定一个表[a, b, c, d]
,我想准确地选择那些max(a)
在组内的行c
即带有a
=的行select max(a) from table group by c
最有效的方法是什么?我可以使用分区条款等吗?
在现实世界中,几乎任何时候都存在可以推测对您有利的线索,问题的特殊性。
您的问题虽然是理想情况,但没有特殊性。此查询将完整扫描表,然后进行一些排序以找到最大值 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;
此查询比使用子查询查找最大值要好,因为它可能会导致多次完整扫描、不需要的嵌套循环或其他性能问题。
请注意,如果您想要所有具有最大 a 的行(即有两个相等的最大行),您应该使用dense_rank()
函数而不是row_number()
您是否尝试过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
分区后可以添加可选的 order by:
SELECT max(a) OVER (PARTITION BY c) max_c FROM...