2017-09-28 9 views
0

Edit: Si cela fait une différence, j'utilise mysql 5.7.19.L'échantillonnage aléatoire utilisant la sous-requête et rand() donne des résultats inattendus

J'ai une table A, et j'essaie d'échantillonner au hasard en moyenne 10% des rangées. J'ai décidé que l'utilisation de rand() dans une sous-requête, puis le filtrage sur ce résultat aléatoire ferait l'affaire, mais il donne des résultats inattendus. Lorsque j'imprime la valeur générée aléatoirement après le filtrage, j'obtiens des valeurs aléatoires qui ne correspondent pas à la clause "where" de ma requête principale, donc je suppose qu'elle régénère la valeur aléatoire dans la sélection externe.

Je suppose qu'il me manque quelque chose à faire avec les sous-requêtes et quand les choses sont exécutées, mais je ne sais pas vraiment ce qui se passe. Est-ce que quelqu'un peut expliquer ce que je pourrais faire de mal? J'ai vérifié ce post: In which sequence are queries and sub-queries executed by the SQL engine?, et ma sous-requête est corrélée, donc je suppose que ma sous-requête est en cours d'exécution en premier, puis la requête principale filtre. Compte tenu de mes hypothèses, je ne comprends pas pourquoi le résultat a des valeurs qui auraient dû être filtrées.

Requête:

select 
    * 
from 
(
    select 
    *, 
    rand() as rand_value 
    from  
    A 
) a_rand 
where 
    rand_value < 0.1; 

Résultat:

-------------------------------------- 
| id | events | rand_value   | 
-------------------------------------- 
| c |  1 | 0.5512495763145849 | <- not what I expected 
-------------------------------------- 
+0

étrange et reproductible, mais il ne semble que cela fonctionne. Je n'obtiens environ que 10% des résultats de ma table à chaque requête, mais je ne sais pas pourquoi elle affiche une valeur supérieure à 0,1 dans la colonne rand_value. Pas lié aux sous-requêtes puisque 'SELECT *, rand() comme valeur_and FROM table ayant une valeur_randonnée <0.1' a le même résultat. – Devon

+1

votre requête ne contient PAS une sous-requête corrélée, juste une simple table dérivée –

+0

ps: voir https://en.wikipedia.org/wiki/Correlated_subquery –

Répondre

0

Je ne suis pas en mesure de reproduire en utilisant this SQL Fiddle utiliser ce lien et cliquez sur le bouton bleu [Exécuter SQL] quelques fois

CREATE TABLE Table1 
    (`x` int) 
; 

INSERT INTO Table1 
    (`x`) 
VALUES 
    (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1) 
; 

Requête 1:

select 
    * 
from (
     select 
      * 
      , rand() as rand_value 
     from Table1 
    ) a_rand 
where 
    rand_value < 0.1 

[Résultats]:

| x |   rand_value | 
|---|---------------------| 
| 1 | 0.03006686086772649 | 
| 1 | 0.09353976332912199 | 
| 1 | 0.08519635823107917 |