Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
Je galère depuis des jours sur mon script, alors je lance cet appel à l'aide.
Dans une table, j'ai les colonnes
matricule, sexe, age, fonction, date_changement
Et des données qui peuvent ressembler à cela :
123456,M,24,Dev,21/01/2019
123456,M,24,DSI, 22/02/2019
124561,F,46,Secrétaire,01/01/2001
124561,F,46,Directrice,01/04/2018
124878,F,56,Vaguemestre,01/01/2019
...
Comme vous le voyez, je peux avoir plusieurs enregistrements avec un seul matricule. Les colonnes sexe, age sont toujours les mêmes pour chaque matricule. Seules les dates de changement et les fonctions changent.
Mon objectif est de créer une table qui contiendrait uniquement les dernières données par matricule.
C'est à dire, un table qui contiendrait :
matricule, sexe, age, fonction, date_changement
123456,M,24,DSI, 22/02/2019
124561,F,46,Directrice,01/04/2018
124878,F,56,Vaguemestre,01/01/2019
J'arrive juste à créer de nouvelles valeurs ainsi :
Final:
Load
Matricule,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Temp
Group By Matricule;
Drop Table Temp;
Mais je ne vois pas comment conserver (ou ajouter) les autres champs : sexe, age et fonction sans que cela n'annule le regroupement par matricule.
Auriez vous une idée ?
Je vous remercie
Bonjour,
Tu n'es pas loin d'une des solutions possibles que je te proposes :
Effectif: // chargement des données de base
Load *
From Source ; // A modifier pour charger le fichier source
right join (Effectif)
Load
Matricule,
sexe,
age,
fonction,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Temp
Group By Matricule,sexe,age,fonction;
Le right join se fait sur tous les champs des deux tables, mais en se basant sur les enregistrements de la deuxième qui ne comporte qu'une seule ligne par MAtricule.
Bonjour,
Merci pour ta réponse, elle m'aide beaucoup.
Il me reste tout de même un point à éclaircir.
Avec ton aide, mon script ressemble maintenant à ceci :
Temp: Load * Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,Dev,'21/01/2019' 123456,M,24,DSI, '22/02/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 124878,F,56,Vaguemestre,'01/01/2019' 424878,F,16,fonction,'01/01/2019' 424878,F,16,fonction2,'01/01/2017' ];
Effectif: // chargement des données de base NOCONCATENATE Load Matricule, sexe, age, fonction, date_changement Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,Dev,'21/01/2019' 123456,M,24,DSI, '22/02/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 124878,F,56,Vaguemestre,'01/01/2019' 424878,F,16,fonction,'01/01/2019' 424878,F,16,fonction2,'01/01/2017' ]; right join (Effectif) Load Matricule, sexe, age, fonction, max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Temp Group By Matricule,sexe,age,fonction; Drop Table Temp;
Quand je créé ensuite un tableau graphique avec les données : matricule, sexe et age, il s'affiche correctement, les informations sont regroupées par matricule.
Matricule sexe age 123456 M 24 124561 F 46 124878 F 56 424878 F 16
Par contre, si j'ajoute une colonne "fonction", pour visualiser la dernière fonction occupée, le tableau graphique me présente tous les enregistrement, en ne tenant donc plus compte du group by initial. C'est la même chose quand j'insère la colonne date_changement.
Matricule sexe age fonction 123456 M 24 Dev 123456 M 24 DSI 124561 F 46 Directrice 124561 F 46 Secrétaire 124878 F 56 Vaguemestre 424878 F 16 fonction 424878 F 16 fonction2
De la même façon, quand je génère un KPI avg(age), je me rends compte qu'il calcule la moyenne sur l'ensemble des enregistrements et non sur la table groupée.
Une idée ?
Merci encore !
Bonjour,
Il ne faut plus charger ta table Temp, car en l'état tes données sont doublées.
Charge juste :
Effectif: // chargement des données de base NOCONCATENATE Load * Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,Dev,'21/01/2019' 123456,M,24,DSI, '22/02/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 124878,F,56,Vaguemestre,'01/01/2019' 424878,F,16,fonction,'01/01/2019' 424878,F,16,fonction2,'01/01/2017' ]; right join (Effectif) Load Matricule, sexe, age, fonction, max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Effectif Group By Matricule,sexe,age,fonction;
Bonjour,
Je dois rater quelque chose, car en supprimant Temp j'ai toujours exactement le même résultat : il regroupe tant qu'on ne demande pas à afficher un champ qui varie d'une entrée à l'autre.
Le rendu avec Matricule, sexe, age :
Matricule sexe age 123456 M 24 124561 F 46 124878 F 56 424878 F 16
Le rendu avec Matricule, sexe, age, date_changement :
Matricule sexe age date_changement 123456 M 24 43486 123456 M 24 43518 124561 F 46 01/01/2001 124561 F 46 43191 124878 F 56 01/01/2019 424878 F 16 01/01/2017 424878 F 16 01/01/2019
Au passage on peut constater que les dates qui ne devraient pas être affichées ne sont pas correctement formatées.
Le rendu avec Matricule, sexe, age, fonction :
Matricule sexe age fonction 123456 M 24 Dev 123456 M 24 DSI 124561 F 46 Directrice 124561 F 46 Secrétaire 124878 F 56 Vaguemestre 424878 F 16 fonction 424878 F 16 fonction2
Merci !
Pardon, c'est de ma faute, il faut enlever Fonction du group by :
Resident Effectif Group By Matricule,sexe,age;
Le problème reste le même, dès que des entrées diffèrent, le regroupement par matricule ne se fait plus.
Par contre le formatage de la date qui ne doit pas s'afficher est bon maintenant ! 😉
Matricule sexe age date_changement 123456 M 24 21/01/2019 123456 M 24 22/02/2019 124561 F 46 01/01/2001 124561 F 46 01/04/2018 124878 F 56 01/01/2019 424878 F 16 01/01/2017 424878 F 16 01/01/2019
Merci encore, ca ne doit pas tenir à grand chose je pense, même si personnellement je sèche un peu :).
Bon... J'ai trouvé une solution, en trichant un peu, mais qui fonctionne étant donné que les dernières fonctions et date de changements sont les dernières inscrites dans le fichier.
Effectif: // chargement des données de base Load * Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,Dev,'21/01/2019' 123456,M,24,DSI, '22/02/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 424878,F,16,fonction2,'01/01/2017' 424878,F,16,fonction,'01/01/2019' 124878,F,56,Vaguemestre,'01/01/2019' ];
NoConcatenate
derniereFonction: load Matricule, sexe, age, lastvalue(fonction) as fonction, lastvalue(date_changement) as date_changement Resident Effectif group by Matricule, sexe, age;
drop table Effectif;
Ca fonctionne, mais c'est fragile, j'aurai préféré réussir à faire le tri proprement afin d'éviter tout risque d'erreur. Donc je reste preneur d'idées !
Merci encore pour le coup de main.
Bonjour,
je vois que la fragilité provient du fait que la table initiale doit être déjà triée par date, ce qui n'est pas forcément évident.
Pour cela, je te propose cela:
Temp: // chargement des données de base Load * Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,DSI, '22/02/2019' 123456,M,24,Dev,'21/01/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 424878,F,16,fonction2,'01/01/2017' 424878,F,16,fonction,'01/01/2019' 124878,F,56,Vaguemestre,'01/01/2019' ]; NoConcatenate Temp2: load Matricule, sexe, age, fonction, date_changement Resident Temp Order By date_changement; drop table Temp; NoConcatenate Effectif: load Matricule, sexe, age, lastvalue(fonction) as fonction, lastvalue(date_changement) as date_changement Resident Temp2 group by Matricule, sexe, age; drop table Temp2;
Bonjour,
Pour rendre le script indépendant de l'âge, il faut l'enlever également du group by. En fait laisser simplement le matricule suffit :
right join (Effectif)
Load
Matricule,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Effectif
Group By Matricule;