根据按另一列分组的不同列的最大值获取值

DRT*_*uli 6 sql oracle

我想根据另一列分组的不同列的最大值来获取列的值.

我有这张桌子:

KEY NUM VAL
A   1   AB
B   1   CD
B   2   EF
C   2   GH
C   3   HI
D   1   JK
D   3   LM
Run Code Online (Sandbox Code Playgroud)

并希望这个结果:

KEY VAL
A   AB
B   EF
C   HI
D   LM
Run Code Online (Sandbox Code Playgroud)

我实际上可以使用此查询来获取它.

select KEY, VAL
from TABLE_NAME TN
where NUM = (
    select max(NUM)
    from TABLE_NAME TMP
    where TMP.KEY = TN.KEY
    )
Run Code Online (Sandbox Code Playgroud)

但是在ORACLE SQL(10g或更高版本)中有更优雅的方式来获得结果吗?

它背后的原因是实际上有多个KEYs,它看起来有点难看.

Gor*_*off 9

你可以使用row_number()以下方法来解决

select key, val
from (select t.*, row_number() over (partition by key order by num desc) as seqnum
      from table_name t
     ) t
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)

你是否认为这更"优雅"可能是一个品味问题.

我应该指出,这与您的查询略有不同.保证每个返回一行key; 你的可以返回多行.如果您想要这种行为,只需使用rank()dense_rank()代替row_number().