2012-03-26 19 views
44

Ho bisogno di selezionare le righe casualmente. Es: supponiamo, un tavolo consta di 100 record, ma ho bisogno di ottenere solo 20 record da quei 100 record e la selezione dei record sarà in modo casuale .. come potrei uscirne? Sto usando Oracle come mio db. qualsiasi suggerimento mi sarebbe di grande aiuto. Grazie in anticipo ..Come ottenere i record casualmente dal database di Oracle?

risposta

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

Non dovrebbe essere 'DBMS_RANDOM.VALUE'? – Filburt

+0

Anche questo funziona. – cagcowboy

+1

Mi picchia. Ciò tuttavia selezionerà solo le prime 20 righe dal tavolo e le ordinerà a caso. –

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

Per selezionare in modo casuale 20 righe penso che sarebbe meglio selezionando l'molti di loro ordinato in modo casuale e selezionando il primo 20 di quel set.

Qualcosa di simile:

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

Migliore utilizzo tavolini per evitare di selezionare grandi blocchi di dati solo per scartare la maggior parte di esso.

28

SAMPLE() non è garantiti per darvi esattamente 20 righe, ma potrebbe essere adatto (e possono eseguire significativamente migliore di una query full + sort-by-casuale per tabelle di grandi dimensioni):

SELECT * 
FROM table SAMPLE(20); 

Nota : il 20 qui è una percentuale approssimativa, non il numero di righe desiderato. In questo caso, dato che hai 100 righe, per ottenere circa 20 righe chiedi un campione del 20%.

+1

è veloce ma non sembra essere molto casuale. i record verso la parte superiore/all'inizio della tabella tendono a essere favoriti. – craigrs84

+1

che succederà se si interrompe la query prima che attraversi l'intera tabella. –

+1

Scusa se ho commesso un errore, il tuo post va bene e i risultati sono equamente distribuiti. È quando aggiungi "where rownum <= 20" in combinazione con sample (20) che i dati iniziano a diventare meno casuali. – craigrs84

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

Questo è più efficiente in quanto non è necessario ordinare la tabella.

+5

L'arresto del campione dopo 20 righe comporta risultati non casuali (le righe trovate in precedenza nella tabella verranno restituite molto più spesso di quelle successive). Inoltre, questo non è garantito per restituire 20 righe. –

Problemi correlati