Comment utiliser la fonction Dif/Lag par groupe de colonnes<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut les membres de la communauté JMP,
J'ai une table de données avec quatre colonnes comme Box, iClass, BinPos et Slot.iClass signifie 24 niveaux de produits, BinPos signifie l'emplacement de la boîte dans l'équipement de tri et Slot indique dans quelle position de fente le produit doit être placé dans la boîte. La boîte est conçue pour contenir une quantité maximale de 100 produits, après quoi une nouvelle boîte vide serait placée. Afin de vérifier que le produit est placé dans la bonne case et que l'incrément de fente est exactement de "1" (parce que parfois j'observe manuellement l'augmentation de l'incrément de fente> 1 ou incrément = 0, ce qui signifiait que la machine de placement avait des problèmes), j'ai essayé d'utiliser la fonction dif/lag pour vérifier l'incrément. Cependant, la formule dif/lag ne me permet pas d'ajouter une fonction pour regrouper par colonne de Box. La Box est en fait l'identifiant unique.
Une formule comme Dif(:Slot,1) peut me dire la différence b/wa certaine par rapport à la ligne qui la précède. Cependant, les lignes sont mélangées avec différentes boîtes en raison du niveau de différence de produit appartenant à la colonne iClass.
J'espère avoir une formule comme Dif(:Slot, 1, :Box) pour travailler. Un expert peut-il fournir des indices pour résoudre ce problème? Un exemple de tableau est joint pour enquête.
Merci d'avance
| Boîte | iClass | BinPos | Fente |
| 72813_2 | 11 | 11 | 64 |
| 73213_2 | 15 | 15 | 2 |
| 73213_2 | 15 | 15 | 3 |
| 73213_2 | 15 | 15 | 4 |
| 73213_2 | 15 | 15 | 5 |
| 73213_2 | 15 | 15 | 6 |
| 73213_2 | 15 | 15 | 7 |
| 73213_2 | 15 | 15 | 8 |
| 73214_2 | 14 | 14 | 1 |
| 73214_2 | 14 | 14 | 2 |
| 73214_2 | 14 | 14 | 3 |
| 73214_2 | 14 | 14 | 4 |
| 73214_2 | 14 | 14 | 5 |
| 73214_2 | 14 | 14 | 6 |
| 73213_2 | 15 | 15 | 9 |
| 73214_2 | 14 | 14 | 7 |
| 73213_2 | 15 | 15 | dix |
| 73213_2 | 15 | 15 | 11 |
| 73213_2 | 15 | 15 | 12 |
| 73213_2 | 15 | 15 | 13 |
| 73213_2 | 15 | 15 | 14 |
| 73213_2 | 15 | 15 | 15 |
| 73214_2 | 14 | 14 | 8 |
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesVoici une reprise de la formule précédente.Cette formule fonctionne avec JMP 14
If( Row() == 1,
dt = Current Data Table()
);
i = Row();
holdBox = :Box;
allrows = dt << get rows where( holdBox == :Box[i] );
If( Loc( As List( allrows ), i )[1] == 1,
1,
:Slot[allrows[Loc( As List( allrows ), i )[1]]] - :Slot[allrows[Loc( As List( allrows ), i )[1] - 1]]
);
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesVoici un petit script qui devrait vous donner les résultats que vous souhaitez pour la date de suppression
Names Default To Here( 1 );
dt = Current Data Table();
// Add a sequence column to capture the current
// order of the data table
dt << New Column( "tableorder", formula( Row() ) );
// Convert the values in the tableorder column to real values
dt:tableorder << delete formula;
// Sort the table in ascending order
dt = dt << Sort(
By( :Tool, :Part, :Install Date ),
Order( Ascending, Ascending, Ascending ),
replace table( 1 )
);
// Create the Remove Date Column
dt << New Column( "Remove Date", Format( "m/d/y", 10 ) );
// Loop across all of the rows and set the Remove Date
For( i = 2, i <= N Rows( dt ), i++,
If( :Tool[i] == :Tool[i - 1] & :Part[i] == :Part[i - 1],
:Remove Date[i - 1] = :install Date[i]
)
);
// Sort the table back to original order
dt = dt << Sort( By( :tableorder ), Order( Ascending ), replace table( 1 ) );
// Remove the tableorder column
dt << delete columns( "tableorder" );
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesJim,
Je le reprends - La formule ne fonctionnait pas car elle ne connaissait pas l'expression Get Rows Where. Dès que j'ai changé le type de colonne (c'était une date, donc je m'en fichais vraiment) en numérique, cela a fonctionné, même s'il n'aime toujours pas le Get Rows Where.
Fondamentalement, ce que j'essaie de faire, c'est de trouver la date précédente par colonne.
J'ai un tableau de l'historique des remplacements de pièces sur différents outils :
| Outil | Partie | Date d'installation | Supprimer la date |
| Outil A | Partie 1 | 03/03/2015 | ??? |
| Outil B | Partie 1 | 04/04/2015 | ??? |
| Outil A | Partie 2 | 05/05/2015 | ??? |
| Outil A | Partie 1 | 06/06/2015 | ??? |
| Outil A | Partie 2 | 07/07/2015 | ??? |
| | | | |
Donc, pour le même outil et la même pièce, j'ai besoin d'obtenir la date d'installation NEXT et de la mettre en tant que date de suppression pour la pièce en cours.
Maintenant, je ne sais pas comment vous assurez-vous qu'il recherche réellement la date NEXT. La formule fonctionne avec les modifications minimales que je peux dire sur les observations limitées, mais pour autant que je comprenne la formule, ce ne serait pas ...
Pourriez-vous s'il vous plaît m'aider à nettoyer cela?
Merci,
M
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesJim,
Il s'agit d'une solution de contournement très utile car elle fournit une fonctionnalité d'une formule inexistante ColLag(); 
Cependant, je vois que cela fait un bon bout de temps que vous n'avez pas posté cette solution de contournement. De nos jours, JMP 14 n'aime pas la façon dont il est écrit. Il indique Get Rows Where est une fonction inconnue et indique que l'utilisation de Current Data Table() dans les formules n'est pas stable.
Existe-t-il une version plus récente de cette solution de contournement ?
Merci,
M
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesSi vous avez besoin de plus de précision dans le timing, @msharp a noté dans un article récent :
Today() n'est précis qu'à la seconde près, Tick Seconds() est précis au 1/60 de seconde et HP TIME() est précis à la microseconde près.
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesAvec autant de lignes, l'utilisation de la méthode de tri serait plus rapide.Voici la méthode que j'utilise pour trouver le temps que prend un script:
commencer = aujourd'hui();
le script ou la partie de script dont vous voulez trouver les minutages
show( aujourd'hui() - début );
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesSalut Jim,
Merci pour l'aide. En fait, j'ai plus de 60 000 lignes dans une seule table quotidienne si j'exécute une formule que vous fournissez, cela prendrait assez de temps.
Serait-ce plus rapide si je triais d'abord les données, puis exécutais la formule ?
Btw, existe-t-il un moyen pour jmp de compter le temps d'exécution d'un script ou d'une formule?
Salutations,
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesL'exemple est une formule pour une nouvelle table, pas un script autonome JSL.Créez une nouvelle colonne et collez la formule dans la formule de la colonne, et cela générera les valeurs incrémentielles souhaitées.



Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesBonjour Jim,
J'ai essayé d'exécuter le script que vous avez créé (copiez et collez simplement l'intégralité du script), cependant, je ne vois rien changer dans la table de données et aucune nouvelle colonne à générer.
J'ai essayé de créer une nouvelle colonne avec votre script mais rien ne fonctionne non plus.
C'est ce que le script que j'ai essayé d'exécuter,
je = Ligne();
allrows = Current Data Table() << obtenir des lignes où ( :Box_ID == :Box_ID );
allrows<< New Column("Test", Numérique, Continu, Formule(If( Loc( As List( allrows ), i )[1] == 1,
1,
slot[allrows[Loc( As List( allrows ), i )[1]]] - slot[allrows[(Loc( As List( allrows ), i )[1])-1]]
)));
Salutations,
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesSi l'ordre absolu des données d'origine n'est pas important, le tri des données et l'utilisation de la fonction Dif fonctionneront.Cependant, voici une formule que vous pouvez utiliser pour calculer l'incrément sans avoir à trier les données.
je = Ligne () ;
tous les rangs = Tableau de données actuel () << obtenir des lignes où ( : Boîte == : Boîte [ je ] ) ;
Si ( Loc ( Comme liste ( tous les rangs ) , je )[ 1 ] == 1 ,
1 ,
fente [ tous les rangs [ Loc ( Comme liste ( tous les rangs ) , je )[ 1 ]]] - fente [ tous les rangs [( Loc ( Comme liste ( tous les rangs ) , je )[ 1 ]) - 1 ]]
) ;
Re : Comment utiliser la fonction Dif/Lag par groupe de colonnesPouvez-vous trier par :Box puis appliquer la formule après avoir vérifié que :Box==Lag(:Box,1) ?