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 :

Groupe de 4 + "éviter" les doublons


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 18
    Par défaut Groupe de 4 + "éviter" les doublons
    Bonjour,

    Je dois, avec une liste données :
    -Ordonner des éléments (voitures) en formant des groupes de 4 ;
    -Éviter de retrouver dans un même groupe les mêmes attributs (ici, couleurs).

    J'ai réussi à faire des groupes de 4, mais je ne vois pas comment éviter que dans un même groupe, on y retrouve plus de couleurs que dans un autre.
    J'emploie le terme "éviter", car ça n'est pas une obligation formelle. Si j'ai 8 voitures dont 3 rouges, je peux avoir 2 voitures rouges dans le groupe 1, n'ayant pas d'autres choix.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ma_table.no_voiture,
    ma_table.couleur,
    ceil(rank() over (order by DBMS_Random.Value())/4) groupe
    from ma_table
    order by groupe
    ;
    J'ai comme résultat :
    Nom : ttt.PNG
Affichages : 222
Taille : 5,2 Ko


    Je travaille sous Oracle, mais je pense que la réponse n'en sera pas forcément influencée, sachant que vous l'aurez compris, la fonction DBMS_Random.Value renvoie un nombre aléatoire).

    En vous remerciant d'avance, si vous aviez une idée qui pourrait m'aider.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour


    que donne ceci ::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    		no_voiture
    	,	couleur
    	,	MOD(ROW_NUMBER() OVER(ORDER BY couleur) , (((COUNT(*) OVER()-1) / 4) + 1)) AS groupe
    FROM ma_table
    ORDER BY groupe

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 637
    Billets dans le blog
    10
    Par défaut
    Je ne crois pas qu'on puisse utiliser une fonction fenêtrée dans une autre fonction fenêtrée

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 18
    Par défaut
    Bonjour,

    Merci de ta sollicitude.

    J'aurais dû préciser que les groupes de 4 doivent être fait "semi-aléatoirement" : il faut une notion de RANDOM, même si j'aimerai ne pas retrouver deux fois la même couleur dans un même groupe.

    Je ne suis pas sûr de réussir à l'écrire en SQL, peut être vais-je devoir être obligé de passer en PL/SQL.

    En te remerciant.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Je ne crois pas qu'on puisse utiliser une fonction fenêtrée dans une autre fonction fenêtrée
    non, c'est vrai que j'aurai pu indenter un peu plus, mais c'est bien deux fonction fenêtrées distinctes, utilisée dans la fonction (non fenêtrée) MOD

    Citation Envoyé par MonsieurTruite Voir le message
    J'aurais dû préciser que les groupes de 4 doivent être fait "semi-aléatoirement" : il faut une notion de RANDOM, même si j'aimerai ne pas retrouver deux fois la même couleur dans un même groupe.
    on peut placer DBMS_Random.Value() en deuxiéme argument de tri pour le ROW_NUMBER(), mais ça n sera pas complétement aléatoire s'il y a des valeurs exceptionnelles au niveau des couleurs...
    à voir le besoin précis, mais si le volume est important, ça doit pouvoir faire le job

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 637
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    non, c'est vrai que j'aurai pu indenter un peu plus, mais c'est bien deux fonction fenêtrées distinctes, utilisée dans la fonction (non fenêtrée) MOD
    Oups en effet, au temps pour moi

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 18
    Par défaut
    Je m'en suis miraculeusement sorti de la façon suivante :

    Je trie, PUIS j'ordonne en fonction de la couleur de façon "alternative", PUIS je rajoute le numéro de groupe.

    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
     
    select tmp_groupe.*,ceil(rownum/4) groupe
    from(
                 select tmp_random.no_voiture,tmp_random.couleur
                from
                (
                        select  ma_table.no_voiture,ma_table.couleur,
                                    rank() over (order by DBMS_Random.Value()) factice
                        from ma_table
                        order by factice
                )tmp_random
                order by ROW_NUMBER() over (partition by tmp_random.couleur order by tmp_random.couleur),tmp_random.couleur
    )tmp_groupe
    order by rownum
    ;
    J'obtiens ce que je voulais, les voitures triées en groupe de 4, en alternant le plus possible les couleurs.

    Nom : t2.PNG
Affichages : 208
Taille : 14,0 Ko


    En espérant que ça puisse servir à quelqu'un un jour. Ca n'est surement pas la best practice mais je n'ai pas pensé à mieux.

    Merci à vous, je passe en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/02/2006, 23h50
  2. publipostage : comment éviter les doublons?
    Par Christophe93250 dans le forum Access
    Réponses: 15
    Dernier message: 03/01/2006, 12h08
  3. éviter les doublons requete insertion
    Par warraf dans le forum Access
    Réponses: 5
    Dernier message: 29/11/2005, 13h53
  4. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

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