Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Voici ce qui m'améne.
Prenons le tableau suivant :
Nb ope Indice P1 P2 P3 P4
2 1 x x
2 x x x
3 x x x
3 1 x x x
2 x x x
3 x x x
4 x x x
Si je vous donne comme info : nb_ope = 3 et P1 = x, P3 = x, qu'elle est le meilleure indice.
A l'oeil, je veux bien, mais l'algo, vous avez ?
Attention, le codage doit se réaliser en TSQL sous MS SQL, donc algo simple (je demande pas la soluce en TSQL).
Attention:
Pour ceux qui aime bien se casser la tête seulement.
PS:
Je n'ai pas encore la soluce
Hors ligne
qq précisions :
* ton tableau est un select * d'une table ou le résultat d'une requête plus complexe ? si oui laquelle ?
* P4 est le dernier élément, ou c'est un cas particulier d'un algo général avec Pn ?
Hors ligne
Ha,
J'aime les courageux.
Voiçi plus d'éléments...
Declare @T1 Table ( nb_ope int, ind int, pdt varchar(10) ) Insert into @T1 values (2,1, 'P1') Insert into @T1 values (2,1, 'P2') Insert into @T1 values (2,2, 'P2') Insert into @T1 values (2,2, 'P3') Insert into @T1 values (2,2, 'P4') Insert into @T1 values (2,3, 'P1') Insert into @T1 values (2,3, 'P3') Insert into @T1 values (2,3, 'P4') Insert into @T1 values (3,1, 'P1') Insert into @T1 values (3,1, 'P2') Insert into @T1 values (3,1, 'P3') Insert into @T1 values (3,2, 'P2') Insert into @T1 values (3,2, 'P3') Insert into @T1 values (3,2, 'P4') Insert into @T1 values (3,3, 'P1') Insert into @T1 values (3,3, 'P3') Insert into @T1 values (3,3, 'P4') Insert into @T1 values (3,4, 'P1') Insert into @T1 values (3,4, 'P2') Insert into @T1 values (3,4, 'P4') /* Le tableau est une vue créé dynamiquement à partir ces infos. La petite crois est appliqué quand il y a la valeur de l'entête dans pdt. L'information peut être stocké sous la forme suivante : */ Declare @info Table ( dateprod datetime, nb_ope int, pdtused varchar(10) ) insert into @info values ('01/11/08', 3, 'P1') insert into @info values ('01/11/08', 3, 'P3') /*Pour compliquer la soluce */ insert into @info values ('02/11/08', 2, 'P3') insert into @info values ('02/11/08', 2, 'P4') /* Bien entendu, nous sommes ds le cas Pn */
[Message de modération]
la balise est code=sql
Hors ligne
J'ai la soluce.
Mais si vous êtes d'accord (les modérateurs), on peut offrir beaucoup de pépites pour celui qui trouve la solution sans utiliser de curseur.
C'est mieux qu'un Sudoku, non.
Hors ligne
Merci modération.
Hors ligne
cposervices a écrit:
Si je vous donne comme info : nb_ope = 3 et P1 = x, P3 = x, qu'elle est le meilleure indice.
Je suis peut-être un peu fatigué - vu qu'erasorz est monté de suite au créneau - mais moi je comprend déjà pas la question...
Quand tu demande le meilleur indice, tu veux dire meilleur dans quel sens?
Hors ligne
Le plus petit (le premier dans l'ordre croissant, Si 1 pas bon, alors 2, ...).
Sorry pour ce manquement.
Hors ligne
heu,
On m'appelle l'erreur.
J'ai pas la soluce
Hors ligne
un premier jet :
SELECT MIN( IND ) FROM ( SELECT IND, COUNT( DISTINCT PDT ) FROM ( SELECT IND, PDT FROM T1 WHERE NB_OPE = 3 AND PDT IN ( 'P1', 'P3' ) ) GROUP BY IND HAVING COUNT( DISTINCT PDT ) >= 2 ) ;
NB : si tu veux satisfaire plus de Pi, p.ex N, il faudra modifier le 2 en N dans HAVING COUNT(DISTINCT PDT)>=2, ce qui fait que ça n'est pas la requête la plus générale, mais je suis à cours de neurones actifs à cette heure-ci...
Hors ligne
C'est pas ça.
J'ai enfin trouvé la soluce.
Mais je vous laisse chercher. Au fait, les modérateurs, combien vous offrez de pépites ?
Hors ligne
j'offre 1M (de ma poche) mais j'aimerais bien avoir un énoncé clair...
du genre, paramètres en entrées, résultat souhaité...
Hors ligne
Bon je me reprends.
Soit la possibilité d'affecter des opérateurs à des postes de travails selon le nombre d'opérateur et un indice préférentiel, c'est à dire que selon ce que l'on doit produire, on priviligéria l'indice 1, sinon le 2, etc... (mais ce point est juste pour éclaircir le besoin d'un indice).
Ce qui donne lorsqu'on met en forme le tableau suivant :
Nb ope Indice P1 P2 P3 P4
2 1 x x
2 x x x
3 x x x
3 1 x x x
2 x x x
3 x x x
4 x x x
On utilise donc cela pour attribuer des OF à des opérateurs sur des postes de travails. Ceci est stocké dans le système.
Selon le besoin, tout les postes de travails ne sont pas forcément attribué alors qu'il serait possible de le faire.
Lorsque l'on ressort la planif, on peut extraire l'information suivante :
Nb ope = 3 et P2 utilisé et P4 utilisé (je change par rapport au début du message, mais cela n'a aucune importance).
Si je dois replanifier, je dois tenir compte de ces OF déjà validé (choix du planificateur, il veut, il a).
Mais je dois trouver quelle est le meilleure indice associé.
Dans ce cas, c'est :
Nb ope Indice P1 P2 P3 P4
2 1 x x
2 x x x
3 x x x
3 1 x x x
2 x x x
3 x x x
4 x x x
Facile à dire à l'oeil, mais comment le faire en SQL ?
Vous avez les tables ci-dessus.
Au fait, c'est faisable en une requête.
Est-ce clair ?
A+
Hors ligne
erasorz a écrit:
du genre, paramètres en entrées, résultat souhaité...
je reformule , donne moi le prototype, p.ex :
FUNCTION RECHERCHE_MEILLEUR_INDICE( NB_OPE IN NUMBER, [...] ) RETURN NUMBER ; -- c'est le [...] qui m'intéresse :p
Hors ligne
Si tu regardes le code SQL un peu plus haut, tu trouveras ton ... dans la table info
Il faut à partir de cette table info retrouver les meilleures indices de la table T1.
Hors ligne
MS SQL hein?
Ben alors c'est super facile:
with temp(ind, ordre) as ( select a2.ind, rank() over(order by a2.ind asc) as ordre from @T1 a2 where nb_ope = 3 group by a2.ind having sum( case when a2.pdt in ('P2', 'P4') then 1 else 0 end ) >= 2 ) select ind from temp where ordre = 1
Les arguments étant le In('P2', 'P4'), le >= 2 et le nb_ope = 3
[modif]Hein? la table Info? Elle sert à quoi celle là? Je croyais que tu cherchais avec quel indice assigner les op à leur poste, qu'est ce qu'on est censé faire de la table des présence effectives?
Hors ligne
non,non
dejà tu as deux requêtes pour sortir le resultat.
De plus, il faut que tu utilises la table info.
En effet, le planning n'est pas tjrs le même, et je ne vais changer mon programme en fnct de celui-ci.
Le resultat doit être de la forme :
Select ... date_prod, indice
From ....
Order by ...
Tout en utilisant uniquement @T1 et @info.
J'aide beaucoup la, mais ca tient dans les ...
Dernière modification par cposervices (06-11-2008 11:20:41)
Hors ligne
cposervices a écrit:
non,non
dejà tu as deux requêtes pour sortir le resultat.
Négatif chef, c'est bien un seul select que tu vois là... Y a juste une clause with, c'est ça qui fait penser à 2 requêtes. En plus, SQL server 2005 est über-optimisé pour ces nouvelles clause CTP...
Hors ligne
Ok,
Mais tu n'utilises pas @info et tu fixes P1 et P2.
C'est pas bon.
Hors ligne
cposervices a écrit:
Ok,
Mais tu n'utilises pas @info et tu fixes P1 et P2.
C'est pas bon.
Haaaa, j'ai compris!!!
Tu veux récupérer l'indice optimal pour un jour x (en lisant l'abaque @T1), sachant que ce jour x, tu as les postes y1 et y1 qui sont occupés (cf. table @info). Et afficher une liste de jours avec chaque fois son index optimum pour ce jour...
C'est ça? Pfiouuu, si c'est ça je vois enfin l'intéret de @info...
Hors ligne
Hors ligne
Je suis sous SQL Server 2000, mais si vous trouvez pour 2005, on dira que vous avez gagné.
Mais cette petite discussion m'aura déjà permis d'optimiser ma soluce. Merci.
Hors ligne
select i.dateprod, min(t.ind) from @info i join @T1 t on i.nb_ope = t.nb_ope and i.pdtused = t.pdt group by i.dateprod having count(distinct i.pdtused) >= 2
Yatzee!
Ouups... avais oublié le having...
Hors ligne
Ca ne marche pas !
si tu ajoutes ce cas :
/*Pour compliquer la soluce */
insert into @info values ('03/11/08', 2, 'P1')
insert into @info values ('03/11/08', 2, 'P3')
insert into @info values ('03/11/08', 2, 'P4')
Ta requête retourne 1.
C'est pas bon, parce que la, il n'y a pas le choix, c'est 3.
Nb ope Indice P1 P2 P3 P4
2 1 x x
2 x x x
3 x x x
3 1 x x x
2 x x x
3 x x x
4 x x x
Hors ligne
Mais rassure toi, la mienne non plus du coup.
Hors ligne
select o.dateprod, ( select top 1 t.ind from @info i join @T1 t on i.nb_ope = t.nb_ope and i.pdtused = t.pdt where i.dateprod = o.dateprod group by i.dateprod, t.ind having count(distinct t.pdt) >= (select count(z.pdtused) from @info z where z.nb_ope = o.nb_ope and z.dateprod = o.dateprod) order by i.dateprod asc, t.ind asc ) from @info o group by o.dateprod, o.nb_ope
...suis-je distrait...
Hors ligne