建议一种有效的查询方式

时间:2013-02-22 04:56:09

标签: sql oracle group-by

如果有一个表[a, b, c, d],我想准确选择那些max(a)

组中c的行

即。 a = select max(a) from table group by c

的行

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

3 个答案:

答案 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...