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
--------------------------------------
é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
votre requête ne contient PAS une sous-requête corrélée, juste une simple table dérivée –
ps: voir https://en.wikipedia.org/wiki/Correlated_subquery –