IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Sélection de lignes aléatoire


Sujet :

Langage SQL

  1. #21
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    237 lignes est le résultat de "savants calculs" ratios et cie !!! et ne peux donc être changé....
    Si vous pouvez le faire pour 235 , je tricherai pour les 2 manquantes !!!!!

  2. #22
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    En essayant d'adapter l'exemple fournit par pacman (merci pacman) à ce que j'ai compris de ton schéma, je te propose cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    select arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d   /*5*47=235 lignes de résultats*/
    from (
           select arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d,
                  ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) as seq /*Ou mieux, order by une autre colonne plus pertinante*/
           from dcpte d
                inner join 
                (SELECT exenum_d 
                 FROM (
                      SELECT exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk
                      FROM (
                            SELECT distinct exenum_d
                            FROM dcpte
                            )
                      ) tmp
                      WHERE rk <= 47
                 ) s
                 on d.exenum_d=s.exenum_d
    )                   
    where seq <= 5
    union all
    select null,null,null,null,null,null,null,null,null from dual /*autant de null que de colonnes*/ /*ligne 236*/
    union all
    select null,null,null,null,null,null,null,null,null from dual /*autant de null que de colonnes*/ /*ligne 237*/
    order by exenum_d

    Par contre, je pense que c'est impossible d'extraire 237 lignes (par cette technique) à cause du random (je continue à y réfléchir mais je suis de plus en plus pessimiste).
    Tiens nous au courrant de ton avancement

    PS : Je ne sais pas ce qui est le mieux entre une jointure et un in
    Et pense à indéxer exenum_d

  3. #23
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Par contre, je pense que c'est impossible d'extraire 237 lignes (par cette technique) à cause du random (je continue à y réfléchir mais je suis de plus en plus pessimiste).
    D'après ce qu'a dit Betty, il y a exactement 47 individus dans la table. Le random ne devrait donc pas gener (il sert même à rien je pense), si j'ai bien compris le principe.

    Ca donnerai quelque chose de ce gout là, (en repompant ta requête ), en ajoutant les deux dernières lignes au hasard cette fois ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d   /*5*47=235 lignes de résultats*/
    FROM (
           SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d,
                  ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) AS seq /*Ou mieux, order by une autre colonne plus pertinante*/
           FROM dcpte d
    )                   
    WHERE seq <= 5
    UNION
    SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d  
    FROM (
           SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d,
                  ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) AS seq
           FROM dcpte d
                INNER JOIN 
                (SELECT exenum_d 
                 FROM (
                      SELECT exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk
                      FROM (
                            SELECT DISTINCT exenum_d
                            FROM dcpte
                            )
                      ) tmp
                      WHERE rk <= 2
                 ) s
                 ON d.exenum_d=s.exenum_d
    )                   
    WHERE seq = 6
    Ceci étant, il nous manque peut être des éléments sur les critères de sélection des lignes.
    Parce que là, on récupèrera toujours les mêmes. On peut toujours ajouter une notion de random pour le champs 'seq' qui permettrait de sélectionner des lignes différentes pour chaque individu, ça ne changera pas qu'on aura toujours 5 lignes pour 45 individus, et 6 pour les 2 individus restants (avec la possibilité de récupérer un doublon si on manque de chance ).

    On pourrait également envisager de ne récupérer qu'une ligne au hasard pour chaque individu, et unir le résultat avec 190 lignes récupérées au hasard dans la table (toujours en admettant qu'il y ait exactement 47 individus représentés dans la table).

  4. #24
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par betty31 Voir le message
    J'ai une table que l'on nommera "dcpt" qui fait 2780 lignes et contient 147 individus.
    Je souhaite sélectionner aléatoirement 47 individus et 237 lignes. et que dans les 237 lignes tous les 47 individus soient présents, même s'ils n'ont qu'une ligne qui les représentent.

    Le tout premier post de betty précise qu'il ya ya plus de 47 individus dans sa table.
    Sinon peut être en passant par une table temporaire ne contenant que 47 individus ?

  5. #25
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Le tout premier post de betty précise qu'il ya ya plus de 47 individus dans sa table.
    Sinon peut être en passant par une table temporaire ne contenant que 47 individus ?
    Oui, on peut toujours passer par une table temporaire nous fournissant 47 individus. Mais je me demande si le '147' dans le premier post de Betty n'était pas une faute de frappe, car par la suite elle dit bien que sa table contient 47 individus.
    Citation Envoyé par betty31 Voir le message
    je reviens vers vous et je reformule ma demande en espèrant être plus claire !!
    ma table contient 50 211 lignes et 47 individus et sachant que mes 47 individus ont au moins 9 lignes qui leur correspondent.
    Je souhaite pouvoir selectionner 237 lignes et que tous mes individus soient représentés.
    Enfin bref, elle pourra toujours confirmer, ou pas

  6. #26
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Au fait, j'espère qu'il y a plus de 47 individus dans la table,
    parce que sinon en sélectionner 47 aléatoirement parmis 47 c'est un peu balo

  7. #27
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ouais, je ne pense pas que le random soit un problème.
    Utilisons par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH Prems AS
    (
    SELECT /*+ materialize */ exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk
                      FROM (
                            SELECT DISTINCT exenum_d
                            FROM dcpte
                            )
                      ) tmp
                      WHERE rk <= 47
    )
    (Le hint n'est pas obligatoire, mais ça fait joli et c'est rassurant)

    A partir de ça, on peut reprendre l'idée de Snipah de faire ça en deux fois.
    (La deuxième "extraction" se fait en jointure avec Prems pour ne pas reprendre les même)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #28
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut pacman,

    J'avais bien pensée à l'astuce du with mais en 9i ça marche with?

    Sur la mienne, c'est refusé, mais il y a peut être un truc à configurer pour pouvoir utiliser cette syntaxe.

  9. #29
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Idem, quand je travaille sur 9i je ne peux pas utiliser le WITH, et Betty utilise 9i.

  10. #30
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ca marche à partir de 9R2 et Betty est en ... 9.2.0.3

    (je fais le malin, mais j'avais pas fait gaffe à ce détail non plus )

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #31
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Etrangement, j'ai la 9.2.0.4, et le WITH n'est pas reconnu

    Edit : Ah si, j'ai dû m'emmêler quelque part... bien vu

  12. #32
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Tu t'es mélangé où snipah moi j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Release 9.2.0.4.0 - Production
    PL/SQL Release 9.2.0.4.0 - Production
    CORE    9.2.0.3.0       Production
    TNS for Linux: Version 9.2.0.4.0 - Production
    NLSRTL Version 9.2.0.4.0 - Production
    et ça marche pas

  13. #33
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bah j'essayais des trucs un peu compliqués, je me faisais jeter au niveau du WITH, du coup j'ai pensé que c'était pas reconnu.
    Et là pour vérifier j'ai testé un truc plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH selection AS 
    (
    SELECT sysdate from dual
    )
    SELECT * FROM selection
    Et c'est passé. J'en déduis que le souci venait d'ailleurs que le WITH...

    En passant, pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> SELECT * FROM v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
    PL/SQL Release 9.2.0.4.0 - Production
    CORE    9.2.0.3.0       Production
    TNS for IBM/AIX RISC System/6000: Version 9.2.0.4.0 - Production
    NLSRTL Version 9.2.0.4.0 - Production

  14. #34
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    bonjour,

    quelqu'un peut m'expliquer le fonctionnement de with .. as.

    merci d'avance.
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  15. #35
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Merci, en fait moi le problème c'est que ça ne marche pas via toad mais ça en marche avec sql+.
    Merci à vous ça va me simplifier la vie.

  16. #36
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par Z3phur Voir le message
    bonjour,

    quelqu'un peut m'expliquer le fonctionnement de with .. as.

    merci d'avance.
    Tu peux jeter un œil ici : http://sqlpro.developpez.com/cours/s...cursives/#LIII

  17. #37
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    merci snipah, je l'avais oublié celle la.
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  18. #38
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Hop Hop, je vous arrête tout de suite avant que vous fassiez de faux espoirs : WITH peut servir pour la récursion partout sauf sur... Oracle !
    (en tous cas sur la V9)

    Par contre, deux points sur lesquels c'est utile :
    - c'est plus joli
    - si tu réutilises le résultat d'une requête

    Typiquement, si tu fais des calculs sur agrégat, et que tu as besoin de faire des requêtes complexes avec les résultats : ça permet de n'exécuter qu'une seule fois la requête.

    Jusqu'à la V10, ajouter le hint /*+ materialize */ assure qu'Oracle ne crée qu'une seule fois la table temporaire correspondante...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  19. #39
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Merci pacman pour ces précisions... surtout pour l'explication du hint

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Récupérer une ligne aléatoire avec fgets
    Par Alexbad dans le forum C
    Réponses: 20
    Dernier message: 30/07/2006, 23h53
  2. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 20h03
  3. Sélection de lignes dans une feuille Excel
    Par lerico dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 09h20
  4. comment obtenir une ligne aléatoirement
    Par titoumimi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2005, 15h52
  5. [JTable] rowHeader et sélection de ligne
    Par norkius dans le forum Composants
    Réponses: 3
    Dernier message: 02/02/2005, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo