Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pobieranie próbek z Oracle, Potrzebujesz dokładnej liczby wyników (klauzula przykładowa)

Pożyczając przykładową tabelę jonearles, widzę dokładnie to samo (w 11gR2 na obrazie programisty OEL), zwykle otrzymując wartości dla a mocno przekrzywiony w kierunku 1; przy małych rozmiarach próbek czasami nie widzę w ogóle żadnego. Z dodatkowym etapem randomizacji/ograniczenia, o którym wspomniałem w komentarzu:

select a, count(*) from (
    select * from test1 sample (1)
    order by dbms_random.value
)
where rownum < 101
group by a;

... z trzema biegami mam:

         A   COUNT(*)
---------- ----------
         1         71
         2         29

         A   COUNT(*)
---------- ----------
         1        100

         A   COUNT(*)
---------- ----------
         1         64
         2         36

Tak, 100% naprawdę wróciło jako 1 w drugim biegu. Samo przekrzywienie wydaje się być raczej przypadkowe. Próbowałem z block modyfikator, który wydawał się nie mieć większego znaczenia, być może zaskakująco – mógłbym sądzić, że w tej sytuacji będzie gorzej.

Będzie to prawdopodobnie wolniejsze, z pewnością dla małych rozmiarów próbek, ponieważ musi trafić na cały stół; ale daje mi dość równe podziały dość konsekwentnie:

select a, count(*) from (
    select a, b from (
        select a, b, row_number() over (order by dbms_random.value) as rn
        from test1
    )
    where rn < 101
)
group by a;

Z trzema biegami mam:

         A   COUNT(*)
---------- ----------
         1         48
         2         52

         A   COUNT(*)
---------- ----------
         1         57
         2         43

         A   COUNT(*)
---------- ----------
         1         49
         2         51

…co wygląda trochę zdrowiej. YMMV oczywiście.

Ten artykuł Oracle obejmuje niektóre techniki próbkowania i możesz chcieć ocenić ora_hash podejście, a także wersja warstwowa, jeśli Twoje dane się rozprzestrzeniają i wymagają tego wymagania dotyczące „reprezentatywności”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Lewy połącz bardzo dużą tabelę i ogranicz połączone wiersze do jednego z największą wartością pola

  2. Jak znaleźć datę 48 godzin pracy z wyłączeniem sobót, niedziel i świąt w Oracle?

  3. Jak wybrać kolumnę o nazwie „data” w Oracle?

  4. Wstawianie wartości null podczas korzystania z funkcji wstawiania zbiorczego

  5. odp.net powiadomienie o zmianie bazy danych