2

给定一个表[a, b, c, d],我想准确地选择那些max(a)在组内的行c

即带有a=的行select max(a) from table group by c

最有效的方法是什么?我可以使用分区条款等吗?

4

3 回答 3

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;

此查询比使用子查询查找最大值要好,因为它可能会导致多次完整扫描、不需要的嵌套循环或其他性能问题。

请注意,如果您想要所有具有最大 a 的行(即有两个相等的最大行),您应该使用dense_rank()函数而不是row_number()

于 2013-02-22T06:39:39.527 回答
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
于 2013-02-23T07:51:01.917 回答
0

分区后可以添加可选的 order by:

 SELECT max(a) OVER (PARTITION BY c) max_c FROM...
于 2013-02-22T18:26:34.433 回答