Uso de PARTITION T-SQL
Cuando realizamos consultas con funciones de agregado, debemos utilizar la sentencia GROUP BY, hasta aquí todos sabemos como funciona, pero ¿cómo podemos obtener otros valores aparte de los que estamos agrupando?
Ejemplo:
Consideren el siguiente modelo de base de datos
Necesitamos obtener los hobbies de las personas con mayor fecha de nacimiento (para qué, no importa, esto es un ejemplo ¬¬)
Para esto haríamos la siguiente consulta
SELECT HOBBY, MAX(BIRTH_DATE) FROM PEOPLE GROUP BY HOBBY
Esta consulta nos devolverá el hobby y la última fecha de nacimiento ingresada para ese hobby.
Ahora supongamos que necesitamos no solo el Hobby y la última fecha de nacimiento, ¿qué pasaría si yo solicitara también el ID, NAME y LASTNAME? ¿Cómo lo hacemos?
Bueno, les comento que existe una comando llamado PARTITION, el cual particiona los datos entregados y nos permite obtener lo que necesitamos:
SELECT * FROM ( SELECT * , ROW_NUMBER() OVER(PARTITION BY HOBBY ORDER BY BIRTH_Date desc) RN FROM PEOPLE ) derived WHERE RN <= 1
La consulta anterior utiliza una técnica que no sé qué tan eficiente será, pero funciona de maravillas 😛
Lo que hace es particionar los datos de cada Hobby, reseteando RowNumber para cada hobby. Una vez que trae todos los datos con su respectivo RowNumber y luego a filtrar 🙂
Si encontraron mi explicación muy enredada, les dejo los scripts para crear las tablas, poblarlas y luego a jugar, un ejemplo vale más que mil explicaciones 🙂
Por motivos de WordPress, los scripts van en PDF y no en .SQL. Simplemente copy/paste ^^
Esta pregunta la hice en Experts-Exchange: fuente