Sélectionner un échantillon aléatoire de résultats à partir d'un résultat de requête

cette question porte sur l'obtention d'un échantillon aléatoire(ish) d'enregistrements sur le serveur SQL et la réponse était d'utiliser TABLESAMPLE . Y a-t-il un équivalent dans Oracle 10?

Si il n'y en a pas, est-il une méthode standard pour obtenir un échantillon aléatoire de résultats d'une requête ensemble? Par exemple, comment peut-on obtenir 1000 lignes aléatoires à partir d'une requête qui retournera des millions normalement?

51
demandé sur Community 2009-04-09 14:33:22

8 réponses

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
67
répondu Quassnoi 2009-04-09 10:35:32

la clause type vous donnera un pourcentage d'échantillon aléatoire de toutes les lignes d'un tableau.

par exemple, nous obtenons ici 25% des lignes:

SELECT * FROM emp SAMPLE(25)

le SQL suivant (en utilisant une des fonctions analytiques) vous donnera un échantillon aléatoire d'un nombre spécifique de chaque occurrence d'une valeur particulière (semblable à un groupe par) dans un tableau.

ici nous échantillonnons 10 de chaque:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10
59
répondu grokster 2017-01-27 20:12:49

, Ce n'est pas une réponse parfaite mais obtenir de bien meilleures performances.

SELECT  *
FROM    (
    SELECT  *
    FROM    mytable sample (0.01)
    ORDER BY
            dbms_random.value
    )
WHERE rownum <= 1000

échantillon vous donnera un pour cent de votre table réelle, si vous voulez vraiment un 1000 lignes que vous devriez ajuster ce nombre. Plus souvent j'ai juste besoin d'un nombre arbitraire de lignes de toute façon donc je ne limite pas mes résultats. Sur ma base de données avec 2 millions de lignes je reçois 2 secondes vs 60 secondes.

select * from mytable sample (0.01)
9
répondu Arturo Hernandez 2013-08-26 16:50:33
SELECT * FROM TABLE_NAME SAMPLE(1)

vous donnera olny une part approximative de 1% plutôt que exactement 1/100 du nombre d'observations. La raison probable est que Oracle génère de façon aléatoire un drapeau pour chaque observation s'inclure dans l'échantillon qu'il génère. L'argument 1 (1%) dans un processus de génération prend le rôle de la probabilité de chaque observation est sélectionné dans l'échantillon.

si cela est vrai, la distribution réelle des tailles d'échantillon sera binomiale.

4
répondu Hors2force 2015-02-19 11:32:56

je sais que cela a déjà été répondu, mais en voyant tant de visites ici, je voudrais ajouter une version qui utilise la clause échantillon mais permet toujours de filtrer les lignes en premier:

with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)

notez cependant que la sélection de base nécessite une colonne ROWID , ce qui signifie qu'elle peut ne pas fonctionner pour certaines vues par exemple.

2
répondu Thomas Tschernich 2016-08-23 12:08:07
La fonction D'échantillon

est utilisée pour les données d'échantillon dans ORACLE. Donc vous pouvez essayer comme ceci: -

SELECT * FROM TABLE_NAME SAMPLE(50);

Ici 50 est le pourcentage de données contenues dans le tableau. Donc si vous voulez 1000 lignes à partir de 100000. Vous pouvez exécuter une requête comme:-

SELECT * FROM TABLE_NAME SAMPLE(1);

j'Espère que cela peut vous aider.

1
répondu Ankit Bajpai 2014-06-25 09:32:17

quelque chose comme ça devrait marcher:

SELECT * 
FROM table_name
WHERE primary_key IN (SELECT primary_key 
                      FROM
                      (
                        SELECT primary_key, SYS.DBMS_RANDOM.RANDOM 
                        FROM table_name 
                        ORDER BY 2
                      )
                      WHERE rownum <= 10 );
0
répondu BASMA SHAWKY 2012-10-26 13:44:14

nous avons été donnés et la tâche de sélectionner seulement deux dossiers de la liste des agents..I. e 2 enregistrements aléatoires pour chaque agent sur une période d'une semaine, etc.... et voici ce que nous avons obtenu et cela fonctionne

with summary as (
Select Dbms_Random.Random As Ran_Number,
             colmn1,
             colm2,
             colm3
             Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank
    From table1, table2
 Where Table1.Id = Table2.Id
 Order By Dbms_Random.Random Asc)
Select tab1.col2,
             tab1.col4,
             tab1.col5,
    From Summary s
 Where s.Rank <= 2;
0
répondu ChrisNZak 2013-05-01 20:17:52