¿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...

Soluciones e-Commerce

|
Dentro de las diferentes opciones open source para ofrecer una completa solución eCommerce para una pequeña/mediana empresa, he elegido una combinación de Joomla + VirtueMart.

Para poder satisfacer algunos requerimientos he necesitado usar algún pluguin como Multilingual registration approval. Así puedo configurar Joomla para permitir el registro automático de usuarios, pero una vez han validado su email, estos no pueden acceder a la tienda hasta que el administrador (que recibe una notificación por email) los valide.

Combinamos estos ingredientes con un pack básico de hosting que permita PHP + MySQL, y ya tenemos una tienda online:

www.secomar.eu

Espíritu olímpico

|
Ayer se disputó una de la pruebas puntuables para la olimpiada empresarial solidaria, 1h de resistencia en el karting. Un everminder tuvo el placer de sudar la camiseta naranja infojobs, consiguiendo durante casi 20min el 9º puesto y el mejor tiempo del equipo: 41.878s. Gracias a una parada en boxes en el momento justo el equipo consiguió bajar al 8º puesto (hubieran sido 3 puntos para la olimpiada).



Desgraciadamente, con el paso del tiempo y el desgaste de los pilotos (algún que otro desvanecimiento), sólo se consiguieron 76 vueltas y el tiempo medio de 47.075s dejó al equipo sin puntuar en el 12º puesto.

Lo importante para evermind fue apoyar a infojobs en esta causa y de rebote dejar el equipo a menos de 1s de everis :)

Espero que la próxima vez podamos sudar la camiseta naranja raona o mejor aún, verde evermind!