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

MS SQL Server Discussion :

Repartition Equitable ? la colle du lundi ;)


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut Repartition Equitable ? la colle du lundi ;)
    bonjour à tous,

    J'ai un sujet de colle, et vu que je suis en train de partir sur une Usine à gaz je suppose qu'il doit y avoir un moyen plus simple de le faire.
    Je m'explique j'ai des magasins (cle_uid) et des personnes attachées à ces magasin (id)

    Seulement voila j'ai plusieurs personnes attachées à plusieurs magasins... sinon c'est trop simple


    L'idée c'est qu'il faut repartir les doublons (id) sur les magasins de manière équitable...
    En gros si il y'a 30 individus dans 3 magasins, il ne faudrait en attribuer 10 à chacun des magasins.

    L'idée c'est pas qu'un magasin récupère tous les doublons et que les autre n'ai plus rien...


    du coup je ne sais pas trop comment faire ?
    ni par ou commencer ?

    Si vous avez des idées ou mieux une solution j'suis preneur...

    cH.





    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    CREATE TABLE Result ([cle] [int] IDENTITY(1,1) NOT NULL primary key,	[CLE_UID] [varchar](50) NULL, [id] [int] NULL);
    insert into result (cle_uid, id) values ('0002', 63410523);
    insert into result (cle_uid, id) values ('0002', 2951987);
    insert into result (cle_uid, id) values ('0002', 10619870);
    insert into result (cle_uid, id) values ('0002', 63637358);
    insert into result (cle_uid, id) values ('0002', 19943103);
    insert into result (cle_uid, id) values ('0002', 26378600);
    insert into result (cle_uid, id) values ('0003', 1605086);
    insert into result (cle_uid, id) values ('0003', 10619870);
    insert into result (cle_uid, id) values ('0003', 63637358);
    insert into result (cle_uid, id) values ('0004', 25354841);
    insert into result (cle_uid, id) values ('0004', 15754800);
    insert into result (cle_uid, id) values ('0004', 47048972);
    insert into result (cle_uid, id) values ('0004', 59446353);
    insert into result (cle_uid, id) values ('0005', 3001622);
    insert into result (cle_uid, id) values ('0005', 67126610);
    insert into result (cle_uid, id) values ('0005', 60769135);
    insert into result (cle_uid, id) values ('0005', 7161369);
    insert into result (cle_uid, id) values ('0005', 44607429);
    insert into result (cle_uid, id) values ('0005', 38007613);
    insert into result (cle_uid, id) values ('0002', 26781330);
    insert into result (cle_uid, id) values ('0002', 52717237);
    insert into result (cle_uid, id) values ('0002', 66183744);
    insert into result (cle_uid, id) values ('0002', 8752346);
    insert into result (cle_uid, id) values ('0002', 52599759);
    insert into result (cle_uid, id) values ('0002', 58263848);
    insert into result (cle_uid, id) values ('0002', 36684662);
    insert into result (cle_uid, id) values ('0003', 66183744);
    insert into result (cle_uid, id) values ('0003', 52599759);
    insert into result (cle_uid, id) values ('0003', 12062832);
    insert into result (cle_uid, id) values ('0003', 62084947);
    insert into result (cle_uid, id) values ('0003', 3153398);
    insert into result (cle_uid, id) values ('0003', 4001093);
    insert into result (cle_uid, id) values ('0003', 60769135);
    insert into result (cle_uid, id) values ('0003', 7161369);
    insert into result (cle_uid, id) values ('0003', 44607429);
    insert into result (cle_uid, id) values ('0003', 15754800);
    insert into result (cle_uid, id) values ('0003', 47057416);
    insert into result (cle_uid, id) values ('0003', 47048972);
    insert into result (cle_uid, id) values ('0003', 3872131);
    insert into result (cle_uid, id) values ('0005', 63410523);
    insert into result (cle_uid, id) values ('0005', 2951987);
    insert into result (cle_uid, id) values ('0005', 10619870);
    insert into result (cle_uid, id) values ('0005', 1335586);
    insert into result (cle_uid, id) values ('0005', 64343210);
    insert into result (cle_uid, id) values ('0005', 19943103);
    insert into result (cle_uid, id) values ('0002', 12062832);
    insert into result (cle_uid, id) values ('0002', 62084947);
    insert into result (cle_uid, id) values ('0002', 67176245);
    insert into result (cle_uid, id) values ('0002', 61903310);
    insert into result (cle_uid, id) values ('0002', 4001093);
    insert into result (cle_uid, id) values ('0002', 3001622);
    insert into result (cle_uid, id) values ('0002', 67126610);
    insert into result (cle_uid, id) values ('0002', 60769135);
    insert into result (cle_uid, id) values ('0002', 7161369);
    insert into result (cle_uid, id) values ('0003', 1335586);
    insert into result (cle_uid, id) values ('0003', 64343210);
    insert into result (cle_uid, id) values ('0003', 19943103);
    insert into result (cle_uid, id) values ('0004', 1605086);
    insert into result (cle_uid, id) values ('0004', 21645893);
    insert into result (cle_uid, id) values ('0005', 63637358);
    insert into result (cle_uid, id) values ('0005', 26781330);
    insert into result (cle_uid, id) values ('0005', 52717237);
    insert into result (cle_uid, id) values ('0005', 66183744);
    insert into result (cle_uid, id) values ('0005', 26378600);
    insert into result (cle_uid, id) values ('0001', 2951987);
    insert into result (cle_uid, id) values ('0001', 10619870);
    insert into result (cle_uid, id) values ('0001', 63637358);
    insert into result (cle_uid, id) values ('0001', 38007613);
    insert into result (cle_uid, id) values ('0001', 1335586);
    insert into result (cle_uid, id) values ('0001', 64343210);
    insert into result (cle_uid, id) values ('0001', 19943103);
    insert into result (cle_uid, id) values ('0002', 918747);
    insert into result (cle_uid, id) values ('0002', 44607429);
    insert into result (cle_uid, id) values ('0002', 3872131);
    insert into result (cle_uid, id) values ('0002', 38007613);
    insert into result (cle_uid, id) values ('0002', 1335586);
    insert into result (cle_uid, id) values ('0002', 64343210);
    insert into result (cle_uid, id) values ('0004', 813904);
    insert into result (cle_uid, id) values ('0004', 35558931);
    insert into result (cle_uid, id) values ('0004', 54648336);
    insert into result (cle_uid, id) values ('0005', 8752346);
    insert into result (cle_uid, id) values ('0005', 52599759);
    insert into result (cle_uid, id) values ('0005', 58263848);
    insert into result (cle_uid, id) values ('0005', 36684662);
    insert into result (cle_uid, id) values ('0005', 12062832);
    insert into result (cle_uid, id) values ('0005', 62084947);
    insert into result (cle_uid, id) values ('0005', 61903310);
    insert into result (cle_uid, id) values ('0005', 3153398);
    insert into result (cle_uid, id) values ('0005', 4001093);
    insert into result (cle_uid, id) values ('0001', 52717237);
    insert into result (cle_uid, id) values ('0001', 52599759);
    insert into result (cle_uid, id) values ('0001', 62084947);
    insert into result (cle_uid, id) values ('0001', 61903310);
    insert into result (cle_uid, id) values ('0001', 3153398);
    insert into result (cle_uid, id) values ('0001', 4001093);
    insert into result (cle_uid, id) values ('0001', 3001622);
    insert into result (cle_uid, id) values ('0001', 53168205);
    insert into result (cle_uid, id) values ('0001', 67126610);
    insert into result (cle_uid, id) values ('0001', 60769135);
    insert into result (cle_uid, id) values ('0001', 7161369);
    -> SGBR=SQL SERVER 2014 <-

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Est-ce que la table Result que vous nous présentez est la table que vous avez actuellement ? est-ce que le but en d'en supprimer les "doublons" afin d'avoir au final aucun doublon, mais avec une répartition "équitable" ?

    ou est-ce que le but est de refaire une répartition complète, de façon équitable ?

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Est-ce que la table Result que vous nous présentez est la table que vous avez actuellement ?
    je l'ai reduite elle est bien plus grosse.


    est-ce que le but en d'en supprimer les "doublons" afin d'avoir au final aucun doublon, mais avec une répartition "équitable" ?
    oui et non il faut garder un des doublons et virer les autres.
    Mais la difficulté c'est de garder sur celui qui permettra un lissage une repartion homogene.
    hors j'etais partis sur un row_number() mais le order ne va me faire garder tout le temps que le meme magasin ? d'ou la difficulté..

    ou est-ce que le but est de refaire une répartition complète, de façon équitable ?
    non, pour les uniques car ils sont parfaitement affectés. eux faut pas en tenir compte ils sont déjà ok.
    pour ceux en doublons et bien il ne faut en garder qu'un pour être unique mais faut arriver a trouver sur lequel de ces doublons on va le garder.
    a la fin il faut que les id soient uniques affectés à un seul magasin mais pas tous au meme pour etre (equitable)

    il faut arriver à trouver le nombre de magasins qui on des communs afin de les repartirs uniformement.. :/
    je sais pas si un trucs recursif serait une solution, on prend les doublons max, et on tourne jusqu'au minimum de 2 ???

    même à expliquer c'est pas simple je trouve...
    -> SGBR=SQL SERVER 2014 <-

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Troyan Voir le message
    je l'ai reduite elle est bien plus grosse.
    Donc le but est bien de supprimer des lignes dans cette table, afin de supprimer les doublons ?

    autre question :
    Est-ce qu'il faut que la répartition soit équitable au final, ou est-ce les doublons qu'il faut répartir équitablement ?

    C'est à dire, si on a deux magasin M1 et M2
    M1 a 6 individus
    M2 a 12 individus, dont 6 en communs avec M1

    Est-ce que la répartition finale doit être de :

    1/ répartition équitable des doublons :
    3 pour M1, 9 pour M2 (chacun récupère 3des 6 doublons)

    ou bien
    2/ répartition finale équitable :
    6 individus pour M1 (qui récupère donc tous les doublons) et 6 également pour M2

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Donc le but est bien de supprimer des lignes dans cette table, afin de supprimer les doublons ?
    oui tout à fait mais pas n'importe comment

    autre question :
    Est-ce qu'il faut que la répartition soit équitable au final, ou est-ce les doublons qu'il faut répartir équitablement ?
    uniquement les doublons de façon equitable.

    C'est à dire, si on a deux magasin M1 et M2
    M1 a 6 individus
    M2 a 12 individus, dont 6 en communs avec M1

    Est-ce que la répartition finale doit être de :

    1/ répartition équitable des doublons :
    3 pour M1, 9 pour M2 (chacun récupère 3des 6 doublons)
    Oui c'est exactement ça...

    ou bien
    2/ répartition finale équitable :
    6 individus pour M1 (qui récupère donc tous les doublons) et 6 également pour M2

    alors dans les discussions que j'ai avec les personnes qui demandent cela effectivement il y'a aussi ta 2e solution de demander.
    Si tu as les 2 c'est tip top

    mais au cas priorisons sur la 1ere
    -> SGBR=SQL SERVER 2014 <-

  6. #6
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    souvent, le plus difficile dans l’écriture d'une requête, c'est de savoir ce qu'elle doit faire !!!
    il faut donc que le besoin soit précisément déterminé

    pour le moment j'ai pris un cas simple pour débuter, mais il reste pas mal de règle de gestion a établir.

    Par exemple, est-ce qu'il ne s'agit que de purs doublons, ou est-ce qu'un individu peut être affecté a plus de 2 magasins ?

    il faut donc des règles précises couvrant tous les cas possibles

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    souvent, le plus difficile dans l’écriture d'une requête, c'est de savoir ce qu'elle doit faire !!!
    il faut donc que le besoin soit précisément déterminé
    Pas faux ça...

    pour le moment j'ai pris un cas simple pour débuter, mais il reste pas mal de règle de gestion a établir.
    Par exemple, est-ce qu'il ne s'agit que de purs doublons, ou est-ce qu'un individu peut être affecté a plus de 2 magasins ?
    alors en fait ce sont des zones de couverture.
    Plusieurs magasins dont les zones se chevauchent, peuvent donc avoir dans leur filet le même individu (doublon)
    Mais justement il faut attribuer un seul individu par magasin, d'où la demande...
    voir l'image

    Nom : circles.png
Affichages : 209
Taille : 63,4 Ko

    il faut donc des règles précises couvrant tous les cas possibles
    Je comprends très bien, j'avoue que c'est pas toujours très clair, mais à force d'en discuter avec eux je cerne mieux le problème... Pas forcement la solution technique.
    -> SGBR=SQL SERVER 2014 <-

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Vous avez une fonction de fenêtrage dédié à faire cela : NTILE. Cela implémente l'algorithme dit "round robin" liée à l'histoire de Robin des bois...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous avez une fonction de fenêtrage dédié à faire cela : NTILE. Cela implémente l'algorithme dit "round robin" liée à l'histoire de Robin des bois...

    A +

    bon j'ai bien une répartition, avec un nombre de id unique à la fin, j'ai utilisé un newid() dans la commande order et j'ai mis dans le ntile(XX) XX vaut le nombre de groupe max à auquel un id peut appartenir ?

    Pas certain de la répartition équitable ?
    Mais je ne sais pas vraiment comment le vérifier...
    parce que si je met un pas sur que ce soit bien plus équitable ?

    Sur les 5 groupes j'ai fait un tableau des communs entre eux... mais bon vu que le groupe 1 peux aussi avoir des communs avec le 03, le 04 etc...
    même le contrôle n'est pas simple... lol
    -> SGBR=SQL SERVER 2014 <-

  10. #10
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    bon je confirme avec le newid() forcement les résultats varient.
    avec un order by cle_uid asc j'ai un type de résultat A
    avec un order by cle_uid desc j'ai un type de résultat B

    mais rien de repartie..., bon c'est déjà un résultat...


    cH.
    -> SGBR=SQL SERVER 2014 <-

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/09/2005, 11h24
  2. Réponses: 3
    Dernier message: 07/09/2005, 16h20
  3. Une colle CSS
    Par gael.mases dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 21/10/2004, 10h49

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