Есть, но это, конечно, не очевидно:
select
*
from
(
select
key,
val,
col,
max(val) over (partition by key) as MaxVal
from
tableA
)
where
val = MaxVal
Использование предложения over
является отличным способом сделать это и не требует никаких посторонних подзапросов. Все, что он делает, это берет максимум val
для каждого ключа, а затем оборачивает этот набор результатов в подзапрос, где мы можем проверить val
против MaxVal
, чтобы убедиться, что мы вытягиваем правильную строку.
Намного чище и быстрее, чем выполнение до трех подзапросов!