2012-03-26 19 views
44

Necesito seleccionar filas al azar. Ej: Supongamos, una tabla consiste en 100 registros, pero necesito obtener solo 20 registros de esos 100 registros y la selección de registros será al azar ... ¿cómo saldré de allí? Estoy usando Oracle como mi DB. cualquier sugerencia me ayudaría mucho. Gracias de antemano ..¿Cómo obtener registros al azar de la base de datos de Oracle?

Respuesta

68
SELECT * 
FROM (
    SELECT * 
    FROM table 
    ORDER BY DBMS_RANDOM.VALUE) 
WHERE rownum < 21; 
+6

¿No debería ser 'DBMS_RANDOM.VALUE'? – Filburt

+0

Eso también funciona. – cagcowboy

+1

Dale un golpe. Sin embargo, esto solo seleccionará las primeras 20 filas de la tabla y las ordenará al azar. –

6
SELECT column FROM 
(SELECT column, dbms_random.value FROM table ORDER BY 2) 
where rownum <= 20; 
3

Para seleccionar al azar 20 filas Creo que sería mejor que la selección de la gran cantidad de ellos ordenó al azar y la selección de los primeros 20 de ese conjunto.

Algo así como:

Select * 
    from (select * 
      from table 
     order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM 
where rownum < 21; 

Usar de preferencia para mesas pequeñas para evitar la selección de grandes cantidades de datos sólo para deshacerse de la mayor parte de ella.

28

SAMPLE() no es garantizado para darle exactamente 20 filas, pero podría ser adecuado (y pueden realizar significativamente mejor que una consulta completa + clasificación por azar para tablas de gran tamaño):

SELECT * 
FROM table SAMPLE(20); 

Nota : el 20 aquí es un porcentaje aproximado, no el número de filas deseado. En este caso, como tiene 100 filas, para obtener aproximadamente 20 filas, solicita una muestra del 20%.

+1

muestra es rápido pero no parece ser muy aleatorio. los registros hacia la parte superior/principio de la tabla tienden a ser favorecidos. – craigrs84

+1

eso sucederá si detiene la consulta antes de que llegue a toda la tabla. –

+1

Lamento haber cometido un error, su publicación está bien y los resultados se distribuyen por igual. Es cuando agrega "where rownum <= 20" en combinación con la muestra (20) que los datos comienzan a ser menos aleatorios. – craigrs84

9
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20; 

Esto es más eficiente, ya que no necesita ordenar la tabla.

+5

Detener la muestra después de 20 filas dará como resultado resultados no aleatorios (las filas que se encuentran antes en la tabla se devolverán con mucha más frecuencia que las posteriores). Además, esto no garantiza devolver 20 filas. –

Cuestiones relacionadas