我有一个类似的查询问题
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
我在想是否有明显的方法(我可能错过了)来简化它(考虑到某些查询可能相当长)。
欢迎提出任何想法。
我有一个类似的查询问题
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
我在想是否有明显的方法(我可能错过了)来简化它(考虑到某些查询可能相当长)。
欢迎提出任何想法。
确实有这个功能,但并不显而易见:
select
*
from
(
select
key,
val,
col,
max(val) over (partition by key) as MaxVal
from
tableA
)
where
val = MaxVal
over
子句是实现此目的的好方法,不需要任何额外的子查询。它只是针对每个键值获取最大的val
,然后将结果集包装在子查询中,在这里我们可以检查val
是否与MaxVal
匹配,以确保我们提取正确的行。
比使用多达三个子查询更加简洁和快速!
max(val) over (partition by key1, key2, key3)
运行得非常好。 - Eric你需要使用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;