sql >> Databasteknik >  >> RDS >> Oracle

Sampling från Oracle, behöver exakt antal resultat (exempelklausul)

När jag lånar jonearles exempeltabell ser jag exakt samma sak (i ​​11gR2 på en OEL-utvecklarbild), vanligtvis får jag värden för a kraftigt sned mot 1; med små provstorlekar kan jag ibland inte se några alls. Med det extra randomiserings-/begränsningssteget jag nämnde 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öpningar fick jag:

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

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

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

Ja, 100 % kom verkligen tillbaka som 1 på andra åket. Själva snedställningen verkar vara ganska slumpmässig. Jag försökte med block modifierare som verkade göra liten skillnad, kanske överraskande - jag kanske trodde att det skulle bli värre i den här situationen.

Detta kommer sannolikt att gå långsammare, särskilt för små urvalsstorlekar, eftersom det måste träffa hela tabellen; men ger mig ganska jämna delningar ganska 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öpningar fick jag:

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

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

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

... som ser lite hälsosammare ut. YMMV såklart.

Denna Oracle-artikel täcker vissa samplingstekniker, och du kanske vill utvärdera ora_hash tillvägagångssätt också, och den stratifierade versionen om din data sprids och dina krav på "representativitet" kräver det.



  1. Hur man ställer in kolumnordningen för en sammansatt primärnyckel med JPA/Hibernate

  2. Kan ett tabellfält innehålla ett bindestreck?

  3. MYSQL Case i select-satsen för kontroll av null

  4. Uppdatera om namnet finns annars infoga - i SQL Server