Está en la página 1de 4

Cómo obtener registros

aleatorios en una consulta de


SQL Server
Escrito por José Manuel Alarcón el 1 septiembre 2015 10:00

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):


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.

BONUS: Consigue GRATIS este ebook sobre SQL >> Héroe en SQL: manual de
iniciación

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):

Puedes probarlo: cada vez que ejecutes la consulta obtendrás un conjunto nuevo de registros,

elegidos de manera totalmente aleatoria.

También podría gustarte