Está en la página 1de 4

Cmo obtener registros

aleatorios en una consulta de


SQL Server
Escrito por Jos Manuel Alarcn el 1 septiembre 2015 10:00

Lo ms habitual cuando hacemos una consulta en una base de datos es que queramos obtener todos

los registros que cumplan una determinada condicin. Por ejemplo, en la base de datos de ejemplo

de Northwind, para obtener todos productos que no estn discontinuados (o sea, que todava 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 sera 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

necesitbamos. Esto es lo ms comn.

Si queremos obtener solamente los 10 primeros productos con ms stock en lugar de todos los

productos, es muy fcil: basta con usar la palabra clave TOP delante de la consulta indicando el

nmero de registros que necesitamos. La consulta sera 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 ms comn y sencilla es

utilizar la funcin NEWID.

BONUS: Consigue GRATIS este ebook sobre SQL >> Hroe en SQL: manual de
iniciacin

Registros aleatorios usando NEWID


SQL Server, desde su versin 2005, dispone de una funcin 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, nmeros 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 espaol

Identificador Globalmente nico. Estn basados en la combinacin de un nmero pseudo-aleatorio

generado en el equipo local junto con la MAC de la primera tarjeta de red del mismo (que tambin

tiene un identificador nico a priori).

Esta funcin NEWID la podemos incluir en la clusula de ordenacin, 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 nmero de registros que necesitamos) lo que conseguiremos en la prctica 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 obtendrs un conjunto nuevo de registros,

elegidos de manera totalmente aleatoria.

También podría gustarte