Registros aleatorios en SQL con newid()

16-Enero-2010 no comentado

Aunque SQL dispone de la función RAND() para generar números aleatorios su uso es limitado. Por ejemplo, si lo ejecutamos varias veces en una misma transacción, siempre nos devolverá el mismo valor. Con lo que, si queremos devolver un valor aleatorio en cada fila de una consulta, no podemos usarlo.

Una opción más potente que el RAND() para generar valores aleatorios es la utilización de la función NEWID() de SQL. NEWID() nos devuelve una cadena larga basada en la MAC de la tarjeta de red y el reloj del sistema. Este sí será un valor aleatorio más útil, ya que obtendremos un valor distinto en cada llamada a NEWID() aunque sea en la misma transacción. Pongamos como ejemplo que queremos devolver un registro aleatorio de una tabla, lo podríamos hacer con esta sentencia:

SELECT TOP 1 *
FROM tabla
ORDER BY NEWID()

Con esto obtendríamos el primer registro pero de un listado con orden aleatorio. Lógicamente, si quitamos el TOP 1 de la sentencia, obtendríamos el listado aleatorio completo. Y si volvemos a ejecutar la sentencia, el mismo listado pero con un orden diferente al obtenido en la anterior ejecución.

Si por algún motivo necesitamos generar en SQL un número aleatorio. Podemos transformar el resultado de la función NEWID() en un entero con la función CHECKSUM de la siguiente manera:

select checksum(newid())

Esta sentencia puede devolver en algún caso números negativos, esto lo solucionamos utilizando la función abs que nos devuelve el valor absoluto:

select abs(checksum(newid()))

Y si queremos limitar el valor de este número aleatorio, utilizamos el resto de la división entera (%) como en otros lenguajes de programación:

select abs(checksum(newid())) % 10

Con esta última sentencia obtenemos un valor aleatorio entre 0 y 9 en SQL.

Palabras destacadas en Registros aleatorios en SQL con newid():

Escribir un comentario