Obtener valor basado en el máximo de una columna diferente agrupada por otra columna [duplicado]

Resuelto DRTauli asked hace 9 años • 1 respuestas

Quiero obtener los valores de una columna según el máximo de una columna diferente agrupada por otra columna.

Tengo esta tabla:

KEY NUM VAL
A   1   AB
B   1   CD
B   2   EF
C   2   GH
C   3   HI
D   1   JK
D   3   LM

Y quiero este resultado:

KEY VAL
A   AB
B   EF
C   HI
D   LM

De hecho, podría usar esta consulta para obtenerlo.

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

Sin embargo, ¿existe una forma más elegante en ORACLE SQL (10g o superior) de obtener el resultado?

La razón detrás de esto es que en realidad hay varios KEYmensajes de correo electrónico y se ve un poco feo.

DRTauli avatar Sep 15 '15 18:09 DRTauli
Aceptado

Puedes abordar esto usando 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;

Si lo consideras más "elegante" probablemente sea una cuestión de gustos.

Debo señalar que esto es sutilmente diferente de su consulta. Se garantiza que esto devolverá una fila para cada uno key; el tuyo podría devolver varias filas. Si desea ese comportamiento, simplemente use rank()o dense_rank()en lugar de row_number().

Gordon Linoff avatar Sep 15 '2015 12:09 Gordon Linoff