Sql 建议一种有效的查询方法

Sql 建议一种有效的查询方法,sql,oracle,group-by,Sql,Oracle,Group By,给定一个表[a,b,c,d],我想在c i、 e.具有a=的行按c从表组中选择最大值(a) 最有效的方法是什么?我可以使用分割子句等吗?在现实世界中,几乎任何时候都存在一条线索,一个问题的特殊性,可以对你有利的推测 你的问题虽然是一个理想情况,但没有特殊性。此查询将完全扫描表,然后进行一些排序以查找最大值: select a,b,c,d from( select a, b, c, d, row_number() over (

给定一个表
[a,b,c,d]
,我想在
c

i、 e.具有
a
=
的行按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(即有两个相等的最大行),则应使用
densite\u rank()
函数,而不是
row\u number()

可在分区后添加可选顺序:

 SELECT max(a) OVER (PARTITION BY c) max_c FROM...

您是否尝试过保持(稠密)排名第一这对我帮助很大,性能也会更好

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

正如解释得很好的那样,性能不一定是最好的,但如果列数少,速度会快得多。@Ben-作为一个业余爱好者,我只做过一次,效果很好,这可以从我过去的问题中看出。我在学习时感谢你的回答!:)我们都在学习:-);至少我希望如此!阅读博客帖子;这是一个很好的例子,说明为什么应该使用KEEP;在大量的列上,它并不总是更快。如果速度不是一个问题,但临时空间是一个问题,那么它仍然是值得的,因为排序组减少了必须计算的行数,因此您将使用更少的空间。@Ben感谢您的帮助。只是这里正在发生的讨论!