sql >> Base de Datos >  >> RDS >> Oracle

Muestreo de Oracle, necesita el número exacto de resultados (cláusula de muestra)

Tomando prestada la tabla de ejemplo de jonearles, veo exactamente lo mismo (en 11gR2 en una imagen de desarrollador OEL), generalmente obtengo valores para a fuertemente sesgado hacia 1; con tamaños de muestra pequeños, a veces no puedo ver ninguno en absoluto. Con el paso adicional de aleatorización/restricción que mencioné en un comentario:

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

... con tres carreras obtuve:

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

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

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

Sí, el 100 % realmente volvió como 1 en la segunda carrera. El sesgo en sí parece ser bastante aleatorio. Probé con el block modificador que parecía hacer poca diferencia, quizás sorprendentemente, podría haber pensado que empeoraría en esta situación.

Es probable que esto sea más lento, ciertamente para tamaños de muestra pequeños, ya que tiene que afectar a toda la tabla; pero me da divisiones bastante uniformes de manera bastante consistente:

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;

Con tres carreras obtuve:

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

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

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

... que se ve un poco más saludable. YMMV por supuesto.

Este artículo de Oracle cubre algunas técnicas de muestreo, y es posible que desee evaluar el ora_hash enfoque también, y la versión estratificada si su difusión de datos y sus requisitos de 'representatividad' lo exigen.