sql-server - round - redondear suma sql
SQL Large Table selecciona la estrategia de filas al azar (1)
Agregue una columna de identidad ''rowid'' ( int
o bigint
según el tamaño de su tabla) y cree un índice exclusivo no agrupado en ella.
La siguiente consulta utiliza la función NEWID()
para devolver aproximadamente el uno por ciento de las filas de la tabla:
SELECT * FROM MyTable
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), rowID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
La columna rowId se incluye en la expresión CHECKSUM para que NEWID () evalúe una vez por fila para lograr el muestreo por fila. La expresión CAST(CHECKSUM(NEWID(), rowid) & 0x7fffffff AS float / CAST(0x7fffffff AS int)
evalúa a un valor flotante aleatorio entre 0 y 1.
De hecho, podría usar cualquier columna indexada en su tabla (creo).
Si solo quieres elegir una sola fila al azar:
SELECT TOP 1 * FROM table
WHERE rowid >= RAND(CHECKSUM(NEWID())) * (SELECT MAX(rowid) FROM table)
Esto funciona en tiempo constante, siempre que la columna rowid
esté indexada. Nota: esto supone que rowid
se distribuye uniformemente en el rango 0..MAX(rowid)
, de ahí la adición de la columna de identidad sugerida. Si su conjunto de datos tiene alguna otra distribución, sus resultados serán sesgados (es decir, algunas filas se seleccionarán con más frecuencia que otras).
Me gustaría seleccionar una fila aleatoria de una tabla muy grande (10 millones de registros). Por lo tanto, la estrategia más común, como RAND()
y NEWID()
, no parece ser práctica.
He intentado la siguiente estrategia y me gustaría saber si esta es la forma más ideal.
Crea un nuevo campo llamado ''RandomSort'' como UniqueIdentified
Al final de cada hora / día hará una
Update RandomSort = NewID()
a toda la tabla- Cada vez que necesito hacer una consulta, puedo hacer un
Top 10 Order by RandomSort
Hace el trabajo (mejor que ORDER BY NewID
), pero no está seguro si esta es la mejor práctica hasta ahora.