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感谢您的帮助。只是这里正在发生的讨论!