¿Cómo obtener el valor máximo de diferentes columnas en una consulta SQL de Oracle?

|
Cuando queremos obtener el valor máximo de una columna solemos usar la función MAX(). Por ejemplo:

SELECT name, MAX(date1)
FROM usuarios GROUP BY name;

Obtendríamos la 'date1' más reciente para el 'usuario'  identificado con 'name'.

Pero que pasa si lo que queremos es obtener el valor máximo de diferentes fechas de un mismo usuario? Para ello tenemos la función GREATEST():

SELECT name, GREATEST(date1, date2)
FROM usuarios;

El problema viene cuando una de las fechas es NULL. Todas las funciones de Oracle devuelven NULL cuando alguno de sus parámetros lo es. Así que si no nos interesa esto, para el ejemplo anterior podríamos inventarnos una fecha ficticia y usar NVL():

SELECT name, GREATEST(nvl(date1,dateX), nvl(date2,dateX))
FROM usuarios;

Si suponemos que dateX es más antigua que cualquier date1 o date2, con esto evitamos que nos devuelva NULL si alguna de ellas lo es. Si las 2 son NULL, nos devolverá dateX. Si queremos mantener el resultado NULL en este caso, se me ocurre añadir el uso de DECODE():

SELECT name,
DECODE(
    GREATEST(nvl(date1,dateX), nvl(date2,dateX)),
    dateX,
    NULL,
    GREATEST(nvl(date1,dateX), nvl(date2,dateX))
)
FROM usuarios;

Cuando el resultado del GREATEST sea dateX, o es que dateX es la más reciente de todas las fechas (no debería) o es que todas son NULL. Así que en este caso devolvemos NULL con el DECODE.

Parece un poco rebuscado y para 2 fechas se puede combinar con otras funciones Oracle, por ejemplo con COALESCE(), pero cuando te encuentras con N columnas, esto me ha parecido lo más sencillo...

0 comentarios: