Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=69f24fff-c1f8-4b91-ab8b-c58452cfdfdc

Cómo obtener registros aleatorios en una consulta de SQL Server

SQLCode

Lo más habitual cuando hacemos una consulta en una base de datos es que queramos obtener todos los registros que cumplan una determinada condición. Por ejemplo, en la base de datos de ejemplo de Northwind, para obtener todos productos que no están discontinuados (o sea, que todavía se venden) y de los que tenemos algo en stock, ordenados de mayor a menor stock disponible y con el nombre la empresa proveedora y su contacto, la consulta sería esta:

SELECT Products.ProductName, Products.UnitPrice, Suppliers.CompanyName, Suppliers.ContactName, Products.UnitsInStock
FROM Products INNER JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID
WHERE (Products.Discontinued = 0) AND (Products.UnitsInStock > 0)
ORDER BY UnitsInStock DESC

Y el resultado es el que se ve en esta captura de pantalla (pulsa para aumentar):

SQL_Ejemplo_1

Como vemos, nos devuelve 68 resultados (se ve abajo a la derecha) y nos da exactamente lo que necesitábamos. Esto es lo más común.

Si queremos obtener solamente los 10 primeros productos con más stock en lugar de todos los productos, es muy fácil: basta con usar la palabra clave TOP delante de la consulta indicando el número de registros que necesitamos. La consulta sería así (destacado en rojo la parte modificada):

SELECT TOP 10 Products.ProductName, Products.UnitPrice, Suppliers.CompanyName, Suppliers.ContactName, Products.UnitsInStock
FROM Products INNER JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID
WHERE (Products.Discontinued = 0) AND (Products.UnitsInStock > 0)
ORDER BY UnitsInStock DESC

Pero ¿qué pasa si lo que necesitamos es que nos devuelva una serie de registros aleatorios? Es decir, que en lugar de ordenarlos por un criterio y que nos devuelva los 10 primeros, nos devuelva 10 escogidos al azar de entre todos los resultados.

Esto puede ser útil para muchas cosas: para llamar a 20 clientes aleatoriamente en una base de datos de clientes, para que se escojan 10 preguntas para un examen entre un conjunto de cientos de ellas, etc...

Para conseguir esto en SQL Server tenemos varias opciones, pero la más común y sencilla es utilizar la función NEWID.

Registros aleatorios usando NEWID

SQL Server, desde su versión 2005, dispone de una función llamada NEWID que lo que hace es generar un nuevo identificador único de tipo GUID (uniqueidentifier), generalmente para insertarlo como valor de un campo y poder identificar de manera única un registro.

El aspecto habitual de uno de estos IDs es como el siguiente:

537CB0CE-95B6-4435-BD3A-468456878D96

es decir, unas cadenas con letras, números y guiones muy largas que son aleatorias y que se asegura que son únicos, de ahí su nombre: GUID, que significa Globally Unique Identifier, o en español Identificador Globalmente Único. Están basados en la combinación de un número pseudo-aleatorio generado en el equipo local junto con la MAC de la primera tarjeta de red del mismo (que también tiene un identificador único a priori).

Esta función NEWID la podemos incluir en la cláusula de ordenación, de esta manera:

SELECT TOP 10 Products.ProductName, Products.UnitPrice, Suppliers.CompanyName, Suppliers.ContactName, Products.UnitsInStock
FROM Products INNER JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID
WHERE (Products.Discontinued = 0) AND (Products.UnitsInStock > 0)
ORDER BY NEWID()

Esto lo que provocará es que, para cada registro, se generará un nuevo identificador único del estilo del que se mostraba antes, y luego se ordenará usando dicho identificador.

Siendo este valor aleatorio completamente, y al haberle colocado un TOP X a la consulta (siendo X el número de registros que necesitamos) lo que conseguiremos en la práctica es obtener los X primeros registros aleatorios de la tabla o tablas que estamos consultando (pulsa para aumentar):

SQL_Aleatoria

Puedes probarlo: cada vez que ejecutes la consulta obtendrás un conjunto nuevo de registros, elegidos de manera totalmente aleatoria.

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Acceso a Datos

¿Te ha gustado este post?
Pues espera a ver nuestra newsletter...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Comentarios (7) -

Muchas gracias por este artículo, era precisamente lo que necesitaba.

Un saludo,

Alejandro

Edgar Borrego
Edgar Borrego

No tenia idea de este metodo de acomodo, agradezco por este conocimiento tan util, tenga un excelente dia senor Jose, usted es una persona informada

Estimado y como hago en este caso: Tengo 300 oficinas (CodOf) y cada una de estas tiene 100 contratos (NroContrato) y deseo aleatoriamente seleccionar 3 contratos de cada oficina. Cual sería la estructura del query..Gracias

Genial!,
sugiero que cambies lo siguiente:
Globally Unique Identifier, o en español Identificar Globalmente Único
por:
Globally Unique Identifier, o en español Identificador Globalmente Único

José Manuel Alarcón
José Manuel Alarcón

Sí, gracias, se trata de una errata, obviamente. Lo cambio ahora mismo.

Saludos.

Gracias por el aporte :)

nirvatrash
nirvatrash

Buen aporte
pero tengo una consulta como puedo realizar una consulta por los vendedores
ordenar una fila  dependiendo de un criterio que yo quiera que no me los ordenes asc o desc

sldos

No se aceptan más comentarios