Oracle
 sql >> Base de données >  >> RDS >> Oracle

Échantillonnage à partir d'Oracle, besoin d'un nombre exact de résultats (exemple de clause)

En empruntant le tableau d'exemple de jonearles, je vois exactement la même chose (en 11gR2 sur une image de développeur OEL), obtenant généralement des valeurs pour a fortement biaisé vers 1; avec de petits échantillons, je peux parfois n'en voir aucun. Avec l'étape supplémentaire de randomisation/restriction que j'ai mentionnée dans un commentaire :

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

... avec trois exécutions, j'ai :

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

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

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

Oui, 100 % sont vraiment revenus sous la forme 1 à la deuxième manche. L'inclinaison elle-même semble plutôt aléatoire. J'ai essayé avec le block modificateur qui semblait faire peu de différence, peut-être étonnamment - j'aurais pu penser que cela empirerait dans cette situation.

Cela est susceptible d'être plus lent, certainement pour les petits échantillons, car il doit toucher l'ensemble du tableau ; mais me donne des répartitions assez régulières assez régulièrement :

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;

Avec trois exécutions, j'ai obtenu :

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

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

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

... qui a l'air un peu plus sain. YMMV bien sûr.

Cet article Oracle couvre certaines techniques d'échantillonnage, et vous voudrez peut-être évaluer le ora_hash approche également, et la version stratifiée si vos données se propagent et vos exigences de "représentativité" l'exigent.