我有一个查询
select b.* from
(select key, max(val) as val from (somequery) group by key) as a
inner join
(somequery) as b
on a.key = b.key and a.val = b.val
order by key
我想知道是否有一种显而易见的方法(我错过了)来简化它(假设某些查询可能相当长)。
任何想法都会受到赞赏。
答案 0 :(得分:2)
有,但肯定不明显:
select
*
from
(
select
key,
val,
col,
max(val) over (partition by key) as MaxVal
from
tableA
)
where
val = MaxVal
使用over
子句是一种很好的方法,并且不需要任何无关的子查询。它所做的只是每个键获取最大val
,然后将结果集包装在子查询中,我们可以在val
对MaxVal
进行检查,以确保我们将其拉出正确的行。
比最多三个子查询更清洁,更快!
答案 1 :(得分:0)
你想为此使用ROW_NUMBER()或RANK()。
(请确保先前的查询以分号结尾)
with ranked as
(
select *, row_number() over (partition by key order by val desc) as bestrow
from sometableorquery
)
select *
from ranked
where bestrow = 1
order by key;
如果你想要关系(这样一个有两个最佳值的键同时返回),那么使用rank()而不是row_number()。
罗布
答案 2 :(得分:-1)
我会在选择子查询之前将其选择到临时表中。我认为你会看到显着的性能提升。