seleccionar registros por obtener numero insertar empleados desde departamento datos consultas cero aprender aleatorios aleatorio sql oracle random-sample

sql - por - seleccionar registros aleatorios oracle



Seleccione una muestra aleatoria de resultados del resultado de una consulta (9)

Esta pregunta requiere obtener una muestra aleatoria (ish) de registros en SQL Server y la respuesta fue usar TABLESAMPLE . ¿Hay un equivalente en Oracle 10?

Si no existe, ¿existe una forma estándar de obtener una muestra aleatoria de resultados de un conjunto de consultas? Por ejemplo, ¿cómo se pueden obtener 1.000 filas aleatorias de una consulta que devolverá millones normalmente?


Algo como esto debería funcionar:

SELECT * FROM table_name WHERE primary_key IN (SELECT primary_key FROM ( SELECT primary_key, SYS.DBMS_RANDOM.RANDOM FROM table_name ORDER BY 2 ) WHERE rownum <= 10 );


Esto no es una respuesta perfecta, pero obtendrá un rendimiento mucho mejor.

SELECT * FROM ( SELECT * FROM mytable sample (0.01) ORDER BY dbms_random.value ) WHERE rownum <= 1000

La muestra le dará un porcentaje de su tabla real, si realmente quisiera 1000 filas, necesitaría ajustar ese número. Más a menudo solo necesito un número arbitrario de filas de todos modos, así que no limito mis resultados. En mi base de datos con 2 millones de filas obtengo 2 segundos frente a 60 segundos.

select * from mytable sample (0.01)


La cláusula SAMPLE le dará un porcentaje de muestra aleatorio de todas las filas en una tabla.

Por ejemplo, aquí obtenemos el 25% de las filas:

SELECT * FROM emp SAMPLE(25)

El siguiente SQL (usando una de las funciones analíticas) le dará una muestra aleatoria de un número específico de cada ocurrencia de un valor particular (similar a un GROUP BY) en una tabla.

Aquí mostramos 10 de cada uno:

SELECT * FROM ( SELECT job, sal, ROW_NUMBER() OVER ( PARTITION BY job ORDER BY job ) SampleCount FROM emp ) WHERE SampleCount <= 10


La función de muestra se usa para los datos de muestra en ORACLE. Entonces puedes intentarlo así:

SELECT * FROM TABLE_NAME SAMPLE(50);

Aquí 50 es el porcentaje de datos que contiene la tabla. Entonces, si quiere 1000 filas de 100000. Puede ejecutar una consulta como: -

SELECT * FROM TABLE_NAME SAMPLE(1);

Espero que esto le pueda ayudar.


Sé que esto ya se ha respondido, pero al ver tantas visitas aquí, me gustaría agregar una versión que use la cláusula SAMPLE pero que permita filtrar las filas primero:

with cte1 as ( select * from t_your_table where your_column = ''ABC'' ) select * from cte1 sample (5)

Sin embargo, ROWID cuenta que la selección base necesita una columna ROWID , lo que significa que puede no funcionar para algunas vistas, por ejemplo.


Se nos asignó la tarea de seleccionar solo dos registros de la lista de agentes, es decir, 2 registros aleatorios para cada agente en el lapso de una semana, etc. ... y a continuación se muestra lo que obtuvimos y funciona

with summary as ( Select Dbms_Random.Random As Ran_Number, colmn1, colm2, colm3 Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank From table1, table2 Where Table1.Id = Table2.Id Order By Dbms_Random.Random Asc) Select tab1.col2, tab1.col4, tab1.col5, From Summary s Where s.Rank <= 2;



SELECT * FROM ( SELECT * FROM mytable ORDER BY dbms_random.value ) WHERE rownum <= 1000


SELECT * FROM TABLE_NAME SAMPLE(1)

Le dará una cuota aproximada del 1% en lugar de exactamente 1/100 del número de observaciones. La razón probable es que Oracle genera un indicador aleatorio para cada observación en cuanto a si se incluye en la muestra que genera. El argumento 1 (1%) en dicho proceso de generación toma el rol de probabilidad de que cada observación se seleccione en la muestra.

Si esto es cierto, la distribución real de los tamaños de muestra será binomial.