Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Post Cruzado de: blog en 3devnet.com

Una de la novedades de SQL Server 2005 son las Funciones de Ranking que se usarán para analizar los datos obtenidos. Entre estas funciones de ranking tenemos, por ejemplo, la función ROW_NUMBER() que nos permite enumerar los resultados de una manera sencilla, es decir, nos devuelve el número secuencial para cada una de la filas de un conjunto de resultados , donde la primera fila es 1.
La sintaxis es:

                     ROW_NUMBER ( ) OVER ( [ partition_by_clause ] order_by_clause )
donde:

partition_by_clause: Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función ROW_NUMBER.

order_by_clause: Determina el orden en el que se asigna el valor ROW_NUMBER a las filas de una partición
He aquí un ejemplo:

Esta consulta nos devolverá el ROW_NUMBER para los detalles de orden de venta en base al precio.


SELECT ROW_NUMBER() OVER( ORDER BY precio DESC ) AS nro, Cod_OrdenVenta, ID_Articulo , cant AS [Cantidad], precio
FROM Detalle_Orden_Venta

row    Cod_OrdenVenta     ID_Articulo  Cantidad     precio
------ --------------- ------------ -------------- -----------
1 00000015 FX8S 1 7621.71
2 00000016 FX8E 1 3601.77
3 00000016 FX5P 1 2207.87
4 00000014 FX5G 1 6507.82
5 00000018 FX21 1 631.62
6 00000019 FX19 1 751.62


NOTA: La cláusula OVER(ORDER BY DESC/ASC) debe usarse siempre que desee aprovecharse la funcionalidad de ROW_NUMBER, de no ser así, ROW_NUMBER no funcionará. :(



He aquí otro ejemplo, donde usamos la cláusula PARTITION para particionar resultados por el cod_grupoarticulo y luego a cada partición resultante se le aplica el ROW_NUMBER en base al stock_articulo, quedando así:

SELECT ROW_NUMBER() OVER(PARTITION BY cod_grupoarticulo ORDER BY stock_articulo ASC) AS NRO, cod_articulo,desc_articulo,cod_grupoarticulo,stock_articulo
FROM ARTICULO



NRO cod_articulo desc_articulo cod_grupoarticulo stock_articulo
---- --------------- --------------------------------- ----------------- --------------
1 DS02 MAINBOARD 845 PEMYL G003 -1
2 DS06 MAINBOARD 850 EV2 G003 10
1 DS07 TECLADO 104 MULTIMEDIA32 G004 20
1 DS12 SWITCH 5 PORT 10/100, 220V G006 26
1 DS45 MUEBLE DE OFICINA G007 34
1 DS76 DISCO DURO G008 20
1 DS07 IMPRESORA LASER G009 10
1 DS45 MEMORIA STICK G010 2
2 DS29 MEMORIA VIDEO G010 5
1 DS08 TINTA CANON BCI24 NEGRO G011 12
1 DS41 WEB CAM ALTIOR MODELO B02 G012 0
1 DS74 MONITOR DE 15 G016 6
1 DS83 IMPRESORA MATRICIAL DFX5001 G018 12
2 DS84 IMPRESORA MATRICIAL DFX8502 G018 17
3 DS21 IMPRESORA MATRICIAL FX21944 G018 48

(15 row(s) affected)

.... a ojo de buen cubero, no hace falta...    .

Saludos.

Percy Reyes.

Published 6/2/2007 17:10 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/02/06/funcionalidad-row-number-sql-server-2005.aspx

Comentarios

# Explorando las funciones de Ranking en SQL Server 2005

Ya ha pasado casi 1 año y medio desde el lanzamiento de SQL Server 2005, trayendo consigo un conjunto

Friday, April 13, 2007 8:15 AM por Percy Reyes vReloaded™ RC1

# Explorando las Funciones de Ranking en SQL Server 2005

Ya ha pasado casi un anio y medio desde el lanzamiento de SQL Server 2005, trayendo consigo un conjunto...

Friday, April 13, 2007 7:24 PM por Percy Reyes vReloaded™ RC1

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Buenas Tardes esta funcionabilidad es lo que necesito como podria hacerlo en sql server 2000 mi correo es caz_zuniga@hotmail.com me pueden ayudar.

Friday, August 03, 2007 9:28 PM por Carlos Zuñiga

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

buenisimo tenia una duda sobre el over... no le tenia el partition by solo order by... y no me estaba jalando bien la query,,, revise que se lo tenia que poner y nitido todo jalo bien... felicidades.. me facilitaste resolver mi error...

Tuesday, October 30, 2007 11:27 PM por Edwin Ramirez

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Hola Edwin!,

Que bueno que sea asi...

Wednesday, October 31, 2007 5:39 AM por Percy Reyes

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Existe alguna funcion similar al Rank o al Row_Number para usarla en Access 2000?

Thursday, November 13, 2008 2:12 PM por Yvan Acosta

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Hola gracias por el post, esta muy interesante. De casualidad sabes como decirle que solo me traiga por decir algo los 2 primeros registro POR cod_grupoarticulo ? quedaría casi el mismo resultado anterior solo que la ultima linea no iria por que es la tercera de un mismo código y solo necesito mostrar 2.

Muchas Gracias...

Wednesday, June 23, 2010 11:37 PM por Andres Tabares

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Es posible que esta funcion trabaje con el Query Designer ?

Wednesday, April 20, 2011 6:10 PM por tony de leon

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Una pregunta estoy haciendo una consulta parecida ala tuya  pero requiero mostrar solo en la consulta por decir aquellos que tienen el campo ROW_NUMBER()  =1 para despues unirlo con otro qu etenga sea igual a 2 pero cuando le pongo en el where para filtarlo me sale error:

SELECT ROW_NUMBER() OVER(PARTITION BY cod_grupoarticulo ORDER BY stock_articulo ASC) AS NRO, cod_articulo,desc_articulo,cod_grupoarticulo,stock_articulo

FROM ARTICULO

where Nro=2

Mens. 207, Nivel 16, Estado 1, Línea 10

El nombre de columna 'Nro' no es válido.

Wednesday, June 15, 2011 8:03 PM por Christian

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

Respuesta para Christian,

ese error es por que "Nro" solo es un alias y no es un campo que puedas filtrar.

Para lograr lo que tu quieres debes pasar el resultado a una tabla temporal y luego a ese realizar el select con los filtro que tu quieres.

Espero te sirva.

Thursday, June 16, 2011 6:07 PM por Orlando

# re: Funcionalidad ROW_NUMBER() ( SQL Server 2005)

EN REALIDAD LA SOLUCION ES MUCHO MAS FACIL

  genera una consulta a tu select y luego filtra, asi:

select * from (SELECT ROW_NUMBER() OVER(PARTITION BY cod_grupoarticulo ORDER BY stock_articulo ASC) AS NRO, cod_articulo,desc_articulo,cod_grupoarticulo,stock_articulo

FROM ARTICULO)

where nro = 2

y listo,

si deseas paginar utiliza between

....where nro between 2 and 10

exito y saludos!

marcoarevalo.cl

Sunday, June 26, 2011 5:04 AM por MARCO AREVALO