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?
8 réponses
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
dbms_random.value
)
WHERE rownum <= 1000
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
, 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)
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.
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.
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.
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 );
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;