tipo registros orden obtener numero insertar generar ejemplos datos dato consultas columna cambiar cadena aleatorios aleatorio aleatoria sql sql-server sql-server-2005 random

registros - orden aleatorio sql server



¿Cómo devuelvo números aleatorios como una columna en SQL Server 2005? (12)

De acuerdo con mis pruebas, la respuesta anterior no genera un valor de 10000 nunca. Esto probablemente no sea un gran problema cuando se genera un azar entre 1 y 10000, pero el mismo algoritmo entre 1 y 5 sería notorio. Agrega 1 a tu mod.

Estoy ejecutando una consulta SQL en SQL Server 2005, y además de consultar 2 columnas de la base de datos, también me gustaría devolver una columna de números aleatorios junto con ellos. Intenté esto:

select column1, column2, floor(rand() * 10000) as column3 from table1

Lo cual funciona un poco, pero el problema es que esta consulta devuelve el mismo número aleatorio en cada fila. Es un número diferente cada vez que ejecuta la consulta, pero no varía de una fila a otra. ¿Cómo puedo hacer esto y obtener un nuevo número aleatorio para cada fila?


Este fragmento parece proporcionar un sustituto razonable para rand() que devuelve un flotante entre 0.0 y 1.0. Utiliza solo los últimos 3 bytes proporcionados por newid() por lo que la aleatoriedad total puede ser ligeramente diferente de la conversión a VARBINARY luego INT y modding a partir de la respuesta recomendada. No he tenido la oportunidad de probar el rendimiento relativo, pero parece lo suficientemente rápido (y lo suficientemente aleatorio) para mis propósitos.

SELECT CAST(SubString(CONVERT(binary(16), newid()), 14, 3) AS INT) / 16777216.0 AS R


La respuesta de Adam funciona muy bien, así que la marqué como aceptada. Mientras esperaba una respuesta, también encontré esta entrada en el blog con algunos otros métodos (un poco menos aleatorios). El método de Kaboing estaba entre ellos.


Me doy cuenta de que esta es una publicación más antigua ... pero no necesita una vista.

select column1, column2, ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as column3 from table1


Necesitas usar un UDF

primero:

CREATE VIEW vRandNumber AS SELECT RAND() as RandNumber

segundo:

CREATE FUNCTION RandNumber() RETURNS float AS BEGIN RETURN (SELECT RandNumber FROM vRandNumber) END

prueba:

SELECT dbo.RandNumber(), * FROM <table>

Arriba tomado del Blog del Servidor SQL de Jeff


Para SQLServer, hay un par de opciones.
1. Un ciclo while para actualizar una columna vacía con un número aleatorio a la vez
2. Un .NET Assembly que contiene una función que devuelve un número aleatorio


Puede considerar generar un UUID en lugar de un número aleatorio usando la función newid. Se garantiza que serán únicas cada vez que se generen, mientras que hay una posibilidad significativa de que se produzca alguna duplicación con un número aleatorio directo (y dependiendo de para qué lo use, podría darle un error fenomenalmente difícil de depurar en un momento posterior)


Uso c # para tratar con números aleatorios. Es mucho más limpio Tengo una función que uso para devolver una lista de números aleatorios y una clave única, luego me uno a la uniqueKey en el número de fila. Como uso c #, puedo especificar fácilmente un rango dentro del cual deben caer los números aleatorios.

Estos son los pasos para realizar la función: http://www.sqlwithcindy.com/2013/04/elegant-random-number-list-in-sql-server.html

Aquí es a lo que mi consulta se asemeja:

SELECT rowNumber, name, randomNumber FROM dbo.tvfRandomNumberList(1,10,100) INNER JOIN (select ROW_NUMBER() over (order by int_id) as ''rowNumber'', name from client )as clients ON clients.rowNumber = uniqueKey


newid () creo que es muy intensivo en recursos. Recuerdo probar ese método en una tabla de unos pocos millones de registros y el rendimiento no fue tan bueno como rand ().


ADVERTENCIA

La respuesta de Adam que involucra la vista es muy ineficiente y para conjuntos muy grandes puede sacar su base de datos por un tiempo, recomiendo encarecidamente que no la use regularmente o en situaciones en las que necesite llenar tablas grandes en producción.

En cambio, podrías usar esta respuesta .

Prueba:

CREATE VIEW vRandNumber AS SELECT RAND() as RandNumber go CREATE FUNCTION RandNumber() RETURNS float AS BEGIN RETURN (SELECT RandNumber FROM vRandNumber) END go create table bigtable(i int) go insert into bigtable select top 100000 1 from sysobjects a join sysobjects b on 1=1 go select cast(dbo.RandNumber() * 10000 as integer) as r into #t from bigtable -- CPU (1607) READS (204639) DURATION (1551) go select ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as r into #t1 from bigtable -- Runs 15 times faster - CPU (78) READS (809) DURATION (99)

Trazo del analizador:

texto alternativo http://img519.imageshack.us/img519/8425/destroydbxu9.png

Esta es una prueba de que las cosas son lo suficientemente aleatorias para números entre 0 y 9999

-- proof that stuff is random enough select avg(r) from #t -- 5004 select STDEV(r) from #t -- 2895.1999 select avg(r) from #t1 -- 4992 select STDEV(r) from #t1 -- 2881.44 select r,count(r) from #t group by r -- 10000 rows returned select r,count(r) from #t1 group by r -- 10000 row returned


Consulta

select column1, column2, cast(new_id() as varchar(10)) as column3 from table1


select RAND(CHECKSUM(NEWID()))