sql >> Databáze >  >> RDS >> Oracle

Vzorkování od společnosti Oracle, potřebujete přesný počet výsledků (vzorová klauzule)

Když jsem si vypůjčil jonearlesovu ukázkovou tabulku, vidím přesně to samé (v 11gR2 na obrázku vývojáře OEL), obvykle získávám hodnoty pro a silně vychýlená směrem k 1; u malých vzorků někdy nevidím vůbec žádné. S dalším krokem randomizace/omezení, který jsem zmínil v komentáři:

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

... se třemi běhy jsem dostal:

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

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

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

Ano, 100 % se skutečně vrátilo jako 1 při druhém běhu. Samotné zkreslení se zdá být spíše náhodné. Zkusil jsem to pomocí block modifikátor, který se zdál mít malý rozdíl, možná překvapivě - mohl jsem si myslet, že se to v této situaci zhorší.

To bude pravděpodobně pomalejší, určitě pro malé velikosti vzorků, protože musí zasáhnout celou tabulku; ale dává mi docela rovnoměrné rozdělení poměrně konzistentně:

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;

Se třemi běhy jsem dostal:

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

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

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

... což vypadá o něco zdravěji. YMMV samozřejmě.

Tento článek Oracle pokrývá některé techniky vzorkování a možná budete chtít vyhodnotit ora_hash přístup také a stratifikovanou verzi, pokud se vaše data šíří a vaše požadavky na „reprezentativnost“ to vyžadují.



  1. Potřebujete pomoc s dotazem sql, abyste našli věci označené všemi zadanými značkami

  2. Jak dynamicky změnit hodnotu globální proměnné v balíčku PL/SQL?

  3. Výkon MySQL, vnitřní spojení, jak se vyhnout Používání dočasných souborů a řazení souborů

  4. O seskupeném indexu v postgresu