我想根据另一列分组的不同列的max获得一列的值。
我有这个表:
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
,它只是看起来有点丑。
您可以使用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()
。