jueves, 6 de junio de 2013

Limitar un conjunto de datos agrupados




El problema es simple,queremos los 5 primeros mails de las personas, tenemos una tabla personas y una tabla mails. y la tabla mails conoce a la tabla personas.  Algo importante es que queremos los últimos mails, es decir los más nuevos.


Como podemos solucionar esto? con oracle la tenemos fácil porque existe el rank, la función rank va rankeando los resultados de una query, los rankea por una condición; por ejemplo los mails por persona:


SELECT RANK () OVER (PARTITION BY persona_id ORDER BY fecha DESC) orden,
persona_id,
email
FROM emails

Ahora bien si queremos limitar la cantidad de mails debemos hacer:

select persona_id, email from
(SELECT RANK () OVER (PARTITION BY persona_id ORDER BY fecha DESC) orden,
persona_id,
email
FROM emails)
WHERE orden < 5

Se pueden hacer muchas cosas muy buenas con rank y over. Over se puede utilizar también con el count.

Y todo gracias a Facundo Torres!!

Dejo links:
http://www.techonthenet.com/oracle/functions/rank.php
http://www.orafaq.com/node/55
http://www.oracle-base.com/articles/misc/rank-dense-rank-first-last-analytic-functions.php