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

时间:2015-09-15 11:52:31

标签: 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

想要这个结果:

KEY VAL
A   AB
B   EF
C   HI
D   LM

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

select KEY, VAL
from TABLE_NAME TN
where NUM = (
    select max(NUM)
    from TABLE_NAME TMP
    where TMP.KEY = TN.KEY
    )

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

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

1 个答案:

答案 0 :(得分:8)

您可以使用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;

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

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