Muchas veces nos encontramos con la necesidad de sacar un “ranking” o un “top 10″ de una serie de resultados. Hasta ahora yo siempre habia usado el atributo ROWNUM en la condicion de la consulta pero esto puede devolvernos valores inesperados. Esto funciona bien cuando quieres limitar el numero de registros pero no cuando quieres los N mayores/menores.
Normalmente usariamos el ROWNUM de esta manera:
SELECT id, descripcion
FROM tabla1
WHERE ROWNUM < 5
ORDER BY fecha DESC
Esto es incorrecto ya que la asignación de valor de ROWNUM se realiza antes de la ordenación, por lo tanto nos esta devolviendo un resultado erróneo. Se podría arreglar la consulta haciendo una consulta anidada que ordenara los valores y otra consulta exterior que filtrara solo los 5 primeros pero es menos óptimo que la solución siguiente.
La forma correcta de hacer esto es mediante la funcion analítica Rank()
En el siguiente ejemplo se muestra como obtener los 5 últimos resultados por fecha descendente.
SELECT id, descripcion
FROM (
SELECT RANK ()
OVER (PARTITION BY id ORDER BY fecha DESC) orden,
Id, descripcion
FROM Tabla1
)
WHERE orden < 5
Estas funciones analiticas estan disponibles en Oracle Database desde la version 8i y podeis consultar su sintaxis Funciones analíticas Rank y Dense_rank
Espero que esta explicación le sea útil a alguien, a mi al menos me ha servido para aclararme algunos conceptos sobre este tipo de funciones analíticas.
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario