|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() ![]() |
Bonjour à tous
Je voudrais savoir s'il est posible de faire un Select aléatoire, je m'explique : dans un premier cas je dois faire un Select TOP 10 car je ne veux que 10 enregistrement selon les clauses WHERE appliquées, mais je voudrias que les enregsitrements concernés soient pris a hasard parmi l'ensemble des enregsitrements répondant aux clauses WHERE. Dans un deuxième cas, je voudrais faire un SELECT avec des clauses WHERE mais que l'ordre des enregistrement soit aléatoire. En gros, entre deux lancements de la requête je voudrais que le résultat ne soit pas "rangé" pareil. Et le tout sans avoir à reprogrammer une usine à gaz. Donc la question est en fait simple : SQL sait il faire cela ou dois je gérer la chose dans mon langage de programmation surjaccent ? Merci pour votre aide.
__________________
Mon blog de création d'univers : Qualhiryann Mon site qui parle de moi moi.ozouf.com |
|
00
|
|
|
#2 |
![]() ![]() |
Quand je cherche à faire de l'aléatoire, je fais un tri sur une donnée complètement abstraite, par exemple la nième décimale d'un id quelconque divisé par le nombre de millisecondes au moment de l'exécution de la requête.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Pourquoi ne pas utiliser le résultat d'une fonction de type Random Waldar ?
|
|
|
00
|
|
|
#4 | ||
![]() ![]() |
La fonction rand() n'est évaluée qu'une fois par requête (sur SQL-Server 2005 en ce qui me concerne) :
Code :
Il y a sûrement moyen de faire mieux différemment, je ne le conteste pas, mais je n'ai pas trouvé de méthode simple sans programmation qui le permette.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() |
Merci pour votre aide.
@Waldar : tu aurais un exemple de déclaration dans le Order BY, je vois pas trés bien comment faire ? @vmolines : ah, y a une fonction Random en SQL server ? Et tu aurais un lien vers une doc, par hasard ?
__________________
Mon blog de création d'univers : Qualhiryann Mon site qui parle de moi moi.ozouf.com |
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
pour ma part, je fais ceci : Code SQL :
|
||
|
|
10
|
|
|
#7 | ||
|
Membre Expert
![]() ![]() |
Citation:
Citation:
Alors, sans programmation, pas exactement, plutôt sans TROP de programmation. En écrivant je viens de voir la réponse de aieeeuuuu (ça fais si mal que ça ???!!!!!) ça me parait être une bonne idée, en fait, pourquoi n'y ai je pas pensé plus tôt ? Et sur un Order By comme ça, je suppose que je ne rajoute aucun autre critère, il doit rester seul ? Merci à tous, je crois qu'on tient le bon bout là.
__________________
Mon blog de création d'univers : Qualhiryann Mon site qui parle de moi moi.ozouf.com |
||
|
00
|
|
|
#8 |
![]() ![]() |
Très bien la réponse de aieeeuuuuu.
En fait la fonction que j'ai décrite je m'en était servi pour remplir une table avec des nombres générés au hasard sur un challenge T-SQL ; pour le tri le newid() suffit largement !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() |
Ok, merci à tous, je clique sur le bouton "résolu".
__________________
Mon blog de création d'univers : Qualhiryann Mon site qui parle de moi moi.ozouf.com |
|
00
|
|
|
#10 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
tu peux aussi ajouter des colonnes après NEWID... mais cela ne servira à rien, puisque NEWID sera unique... Je ne sais pas si c'etait le fond de la question, mais tu peux parfaitement ajouter une clause WHERE Enfin, si tu veux classer tes 10 resultats, tu peux englober la requete dans une pseudo table : Code SQL :
|
|||
|
|
00
|
|
|
#11 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Autre possibilité (de plus prévue par la norme SQL) et qui fonctionne sous SQL Server : utiliser TABLESAMPLE
Code :
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||
|
10
|
|
|
#12 |
|
Membre Expert
![]() ![]() |
Encore merci.
Je vais faire des tests avec tout ça.
__________________
Mon blog de création d'univers : Qualhiryann Mon site qui parle de moi moi.ozouf.com |
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
@SQLPro
La doc sur TABLESAMPLE indique de ne pas l'utiliser pour obtenir des données réellement aléatoires... Il semble que ce soit les pages de données "choisies" qui soient aléatoires... mais que l'ensemble de chaque page est retourné. ils donnent même un exemple (que je trouve tordu) utilisant également NEWID() pour obtenir un pourcentage de données aléatoires... Enfin, la clause WHERE est appliquée après l’échantillonnage, donc on n'obtiendra pas forcément le nombre voulu de lignes. Je pense que sur des faibles volumétries, TABLESAMPLE est difficile à appliquer. Par contre en effet, sur des très grosses volumétries, ca peut apporter un gain de perfs(en évitant un ORDER BY sur des millions de lignes), et dans ce cas je combinerais les deux solutions (TABLESAMPLE + NEWID) afin d'avoir des valeurs réellement aléatoires tout en limitant la la charge. (mais la encore, rien ne garantit le nombre de lignes de resultats, et TABLESAMPLE n'est pas applicable à une table dérivée...) |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com