2012-03-26 13 views
44

Muszę losowo wybierać rzędy. Przykład: załóżmy, że tabela składa się ze 100 rekordów, ale muszę uzyskać tylko 20 rekordów z tych 100 rekordów, a wybór rekordów będzie losowy. Jak mógłbym z niego wyjść? Używam wyroczni jako mojego db. każda sugestia bardzo mi pomogłaby. góry dzięki ..Jak uzyskać losowo rekordy z bazy danych Oracle?

Odpowiedz

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

Czy nie powinien to być "DBMS_RANDOM.VALUE"? – Filburt

+0

To też działa. – cagcowboy

+1

Pokonaj mnie. Będzie to jednak tylko wybrać pierwsze 20 wierszy z tabeli i zamówić je losowo. –

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

Aby losowo wybrać 20 wierszy myślę, że można lepiej, wybierając wiele z nich losowo uporządkowaną i wybraniu pierwszej 20 tego zestawu.

Coś jak:

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

Najlepiej używać do stolików, aby uniknąć wybierając duże ilości danych tylko odrzucić większość z nich.

28

SAMPLE() nie gwarantowana dać dokładnie 20 wierszy, ale może być odpowiedni (i może wykonywać znacznie lepiej niż pełnej kwerendy + sort-by-losowych dla dużych tabel):

SELECT * 
FROM table SAMPLE(20); 

Note : tutaj jest przybliżony procent, a nie liczba żądanych wierszy. W tym przypadku, ponieważ masz 100 wierszy, aby uzyskać około 20 wierszy, poprosimy o próbkę 20%.

+1

Próbka jest szybka, ale nie wydaje się być bardzo losowa. rekordy w górę/na początku tabeli są preferowane. – craigrs84

+1

to się stanie, jeśli zatrzymasz zapytanie, zanim przejdzie przez całą tabelę. –

+1

Niestety popełniłem błąd, twój wpis jest w porządku, a wyniki są równo rozłożone. Kiedy dodajesz "gdzie rownum <= 20" w połączeniu z próbką (20), dane stają się mniej losowe. – craigrs84

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

Jest to bardziej wydajny sposób, ponieważ nie trzeba sortować tabeli.

+5

Zatrzymanie próbki po 20 wierszach spowoduje, że wyniki nie będą losowe (wiersze znalezione wcześniej w tabeli będą zwracane znacznie częściej niż później). Ponadto nie ma gwarancji, że zwróci 20 wierszy. –

Powiązane problemy