suma round redondear operador menos matematicas hacia funciones centenas arriba sql-server select

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.

  1. Crea un nuevo campo llamado ''RandomSort'' como UniqueIdentified

  2. Al final de cada hora / día hará una Update RandomSort = NewID() a toda la tabla

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