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;
También hay una cláusula de muestra especial para seleccionar un porcentaje: http://oracleact.com/papers/sampleclause.html
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.