sql >> Database teknologi >  >> RDS >> Oracle

Sampling fra Oracle, brug for nøjagtigt antal resultater (Sample Clause)

Når jeg låner jonearles' eksempeltabel, ser jeg nøjagtig det samme (i 11gR2 på et OEL-udviklerbillede), som normalt får værdier for a stærkt skævt mod 1; med små stikprøvestørrelser kan jeg nogle gange slet ikke se nogen. Med det ekstra randomiserings-/begrænsningstrin, jeg nævnte i en kommentar:

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

... med tre løb fik jeg:

A COUNT(*) ---------- ---------- 1 71 2 29 A COUNT(*) ---------- ---------- 1 100 A COUNT(*) ---------- ---------- 1 64 2 36

Ja, 100 % kom virkelig tilbage som 1 på anden kørsel. Selve skævningen ser ud til at være ret tilfældig. Jeg prøvede med block modifikator, som syntes at gøre en lille forskel, måske overraskende - jeg troede måske, at det ville blive værre i denne situation.

Dette vil sandsynligvis være langsommere, bestemt for små stikprøvestørrelser, da det skal ramme hele bordet; men giver mig ret jævne opdelinger ret konsekvent:

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;
 

Med tre løb fik jeg:

A COUNT(*) ---------- ---------- 1 48 2 52 A COUNT(*) ---------- ---------- 1 57 2 43 A COUNT(*) ---------- ---------- 1 49 2 51

... som ser lidt sundere ud. YMMV selvfølgelig.

Denne Oracle-artikel dækker nogle prøvetagningsteknikker, og du vil måske evaluere ora_hash tilgang også, og den stratificerede version, hvis dine data spredes og dine krav om 'repræsentativitet' kræver det.



  1. PHP Advarsel ved opstart under forsøg på at indlæse php_oci8.dll

  2. Ingen Entity Framework-udbyder fundet for 'MySql.Data.MySqlClient' ADO.NET-udbyder

  3. udskiftning af firkantede parenteser af en streng med oracle REGEXP_REPLACE funktion

  4. Omgå selvreference i en DELETE-forespørgsel