INSTRUCCION RANK y DENSE_RANK
Imagina que contamos con un grupo de alumnos de los cuales tenemos las notas obtenidas en las materias de Matemática, Humanidades, Derecho y queremos saber en base a su nota la posición obtenida del alumno en cada materia, para esto necesitaríamos clasificar las notas de mayor a menor.
Otro ejemplo podría ser si imaginamos una lista de productos agrupados por una categoría y queremos organizar los productos del más caro al más barato por cada categoría, la imagen de abajo muestra los datos sin ordenar.
Para esto en SQL Server de Microsoft usamos la instrucciónes RANK ó DENSE_RANK
RANK
La instrucción RANK permite clasificar los elementos de un grupo en posiciones (primero, segundo, tercero…..n), si hay elementos con el mismo valor los coloca dentro de la misma posición (como en empate) pero al inmediato inferior le da la posición en base al numero de elementos existentes, Ejemplo:
Select Categoria, NombreProducto, Precio, RANK () over(partitionby categoria
orderby precio desc) as Posicion from Producto
DENSE_RANK
Igual que la instrucción RANK, permite clasificar los elementos de un grupo en posiciones (primero, segundo, tercero…..n), llenando totas las posiciones hasta quedarse sin elementos, si hay elementos con el mismo valor los coloca dentro de la misma posición (como en empate) y al inmediato inferior le da el correlativo siguiente a la clasificación de posición, Ejemplo:
SELECT Categoria, NombreProducto, Precio, dense_rank()over(partitionby categoria orderby precio desc) as Posicion from Producto
Pingback: Rank y dense_rank en pl/sql « Aprendiendojava2009's Blog
Me podrías decir como hago para sacar la posición de un solo producto?
digamos si solo quiero saber en que posición del ranking esta Chai, como hago para que me salga la informacion de ese producto y el 10 ?
Tendrías que aplicar un filtro (where o having), por el nombre del producto o por el numero del rank
muchas gracias, llevaba buen rato tratando de entender 🙂
Hola,
Gracias por la información, si quisiera hacerlo al revés, es decir, que me los acomode de menor a mayor, siendo el de menor valor el que este en el ranking 1.
Gracias.
Saludos!
Para esto solo tienes que cambiar que el orden lo haga ascendente con la instrucción ASC en vez de DESC
El ejemplo sería de esta manera:
Select Categoria, NombreProducto, Precio, RANK () over(partitionby categoria
orderby precio ASC) as Posicion from Producto