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