
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.
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.