Oracle
 sql >> база данни >  >> RDS >> Oracle

Вземане на проби от Oracle, Нужен е точен брой резултати (Примерна клауза)

Заимствайки примерната таблица на jonearles, виждам точно същото нещо (в 11gR2 на изображение на OEL разработчик), обикновено получавайки стойности за a силно изкривена към 1; с малки размери на извадката понякога не виждам изобщо. С допълнителната стъпка за рандомизиране/ограничаване, която споменах в коментар:

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

... с три изпълнения получих:

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

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

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

Да, 100% наистина се върна като 1 на второто бягане. Самото изкривяване изглежда доста случайно. Опитах с block модификатор, който изглежда нямаше значение, може би изненадващо - може би си мислех, че ще се влоши в тази ситуация.

Това вероятно ще бъде по-бавно, със сигурност за малки размери на извадката, тъй като трябва да достигне цялата таблица; но ми дава доста равномерни разделяния доста последователно:

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;

С три изпълнения получих:

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

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

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

... което изглежда малко по-здравословно. YMMV разбира се.

Тази статия на Oracle обхваща някои техники за вземане на проби и може да искате да оцените ora_hash подход, както и стратифицираната версия, ако разпространението на вашите данни и изискванията ви за „представителност“ го изискват.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL превключване от декодиране към регистър

  2. Административни скриптове в R12.2 Ebuisness Suite

  3. Брой петъци между две дати

  4. Оракул. Как да изведем дата и час?

  5. хванете изключение на DB в JSF+EJB приложение