J'essaie de sélectionner un échantillonnage aléatoire de 10% à partir d'une petite table. Je pensais que je venais d'utiliser la fonction RAND() et sélectionnez les lignes où le nombre aléatoire est inférieur à 0,10:Qu'est-ce que je fais de mal en utilisant RAND() dans MS SQL Server 2005?
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
Mais je me suis vite découvert que RAND() retourne toujours le même numéro! Me rappelle de cette xkcd cartoon.
OK, pas de problème, la fonction RAND prend une valeur de départ. Je vais courir cette requête périodiquement, et je veux donner des résultats différents si je cours sur un autre jour, je sème avec une combinaison de la date et une ligne unique ID:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10
Je encore n'obtiens aucun résultat! Quand je montre les nombres aléatoires retournés par RAND, je découvre qu'ils sont tous dans une fourchette étroite. Il semble que l'obtention d'un nombre aléatoire à partir de RAND vous oblige à utiliser une graine aléatoire. Si j'avais une graine aléatoire en premier lieu, je n'aurais pas besoin d'un nombre aléatoire!
J'ai vu les discussions précédentes liées à ce problème:
SQL Server Random Sort
How to request a random row in SQL?
Ils ne me aident pas. TABLESAMPLE fonctionne au niveau de la page, ce qui est idéal pour une grande table mais pas pour une petite table, et il semble qu'elle s'applique avant la clause WHERE. TOP avec NEWID ne fonctionne pas car je ne sais pas à l'avance combien de lignes je veux.
Quelqu'un at-il une solution, ou au moins un indice?
Editer: Merci à AlexCuse pour un solution qui fonctionne pour mon cas particulier. Maintenant à la question plus large, comment faire RAND se comporter?
Une approximation à 10% était assez bonne pour moi, mais votre réponse résout bien mon problème immédiat. J'aurais dû penser à vérifier une clause PERCENT sur TOP. –