Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wirdDazu gibt es einige Möglichkeiten (insbesondere beim Skripting).Möglicherweise können Sie mithilfe von JMP Query Builder im Menü „Tabellen“ eine SQL-Abfrage erstellen (Sie können damit Datentabellen verwenden), in der Sie die Bereiche und die Art und Weise definieren können, wie Zeilen verbunden werden sollen.
Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Hier ist mein Ansatz.Wenn die Daten sortiert sind, können sie einmal durchlaufen werden und die benötigten Werte können gefunden werden.Werfen Sie einen Blick auf die JSL unten für den allgemeinen Ansatz.Der Code ist nicht getestet, ich habe keine Datentabellen, um ihn zu testen.Ich habe diesen Ansatz jedoch schon oft verwendet, und es ist ein effizienter Ansatz.Aber seien Sie bereit, es ein wenig anzupassen.
Names Default To Here( 1 );
dt = Current Data Table();
nr = N Rows( dt );
dtPDTag = Data Table( "2205 - 2209 PD3102" );
nrPD = N Rows( dtPDTag );
// Sort both data tables by the timestamps to allow the tables to only
// have to be read once
// Before sorting the data, if the tables need to be returned to the
// original order then create a new column in each table that represents
// the current Row number, which then will allow the table to be sorted
// back to the original order
// dt << New Column( "_row_", set each value( Row() ));
// dtPDTag << New Column( "_row_", set each value( Row() ));
dt << sort( By( :StartTime, :EndTime ), order( ascending, ascending ), replace table( 1 ) );
dtPDTag << sort( By( :DateTime ), order( ascending ), replace table( 1 ) );
PDStart = 1; // Variable that keeps track of where in the dtPDTag table to start to find values
For( dtI = 1, dtI <= nr, dtI++,
For( dtPDI = PDStart, dtPDI <= nrPD, dtPDI++,
If( ( dtPDTag:DateTime[dtPDI] > dt:StartTime[dtI] ) & ( dtPDTag:DateTime[dtPDI] < dt:EndTime ),
dtPDTag:PO[dtPDI] = dt:PO[dtI];
dtPDTag:Symbol[dtPDI] = dt:Symbol[dtI];
PDStart = dtPDI;
Break();
)
);
// Resort to original if required and delete the _row_ column
// dt << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dt << delete columns( :_row_ );
// dtPDTag << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dtPDTag << delete columns( :_row_ );
Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Danke Jim. Um die Interpretation im Vergleich zu meinem nicht so effizienten Code zu überprüfen:
- Sie führen PDStart als Zähler ein, um zu vermeiden, dass Sie immer wieder Zeilen durchlaufen, auf die bereits bereits geantwortet wurde
- Sie enthalten Break(); die Schleife so schnell wie möglich zu verlassen, um dies zu tun
Kurz gesagt, beseitigen Sie mit diesen beiden Ergänzungen die Redundanz, die meinem Code innewohnt?
Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Richtig!
Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Hallo,
Ich merke, ich bin spät dran. Ich habe mich entschieden zu antworten, weil ich damals, als ich im Halbfinale gearbeitet habe, ein ähnliches Bedürfnis hatte und meine Datentabelle so groß war, dass selbst eine einzelne Schleife mit einer Unterbrechung für mich nicht funktionierte. Wenn Ihre Tabellen so groß sind, prüfen Sie, ob das Folgende für Sie funktioniert. Es ist, was ich tun musste. Im allgemeinen Fall, wenn Sie während eines einzelnen Prozessschritts viele Zeitstempel haben, spart dies VIEL Zeit. Dies hat zwei Gründe: Erstens gibt es keine Vergleiche. Zweitens iteriert es nur einmal für jeden Prozessschritt und setzt Tabellenzeilen in großen Mengen auf Werte. Dazu werden die Zeitstempeldaten des Rezepts direkt mit der Originaltabelle verkettet, mit den beiden zusammengearbeitet und dann die Rezeptdaten entfernt.
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
Wenn Sie das zufällig sehen, lassen Sie mich wissen, wie es geht.
Beifall,
Brady
Betreff: Effizienteste Möglichkeit, Zeilen Informationen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Hallo Brady, vielen Dank für den Code.
Dem Code fehlt ein Teil, um die Arbeit vollständig zu erledigen. Es ordnet die richtige PO-Nummer und Rezept-ID vom Beginn des Laufs an zu, hört aber nicht auf, wenn die PO vorbei ist ... was bedeutet, dass Rezept-ID und PO bis zum Start der nächsten PO weiterhin in Zeilen angeordnet werden eine Art "Überlauf".
Ich habe Tausende von Zeilen in meiner Datentabelle, aber sagen wir, es gab 10 Zeiträume vom Beginn einer Bestellung bis zur nächsten, aber die erste Bestellung ging von Zeitraum 1 bis 7, ich möchte, dass die Zeiträume 8 und 9 " leer", daher gelöscht, da zu diesem Zeitpunkt keine Produktion stattfand, und dann ab Zeitraum 10 mit der nächsten Bestellung fortfahren.
Hoffe die Erklärung macht Sinn.
Der effizienteste Weg, Informationen zu Zeilen hinzuzufügen, indem der Zeitstempel aus zwei Datentabellen abgeglichen wird?Ich habe Historian-Daten über einen langen Zeitraum in 5-Sekunden-Intervallen extrahiert und am Ende eine Datentabelle mit vielen, vielen Zeilen erhalten. Anfangs hatte diese Datentabelle zwei Spalten (nennen Sie diese Tabelle „2205 – 2209 PD3102“ und ich habe darauf als dtPDTag verwiesen):
1. Datums-/Zeitstempel
2. Datenwert (für das Historian-Tag)
In einer anderen Datentabelle (dt in der folgenden JSL-Syntax) hatte ich die Start- und Endzeit der Produktionen, für die ich die Bestellkennung und das Rezeptsymbol hatte. (Also vier Spalten: 1. Startdatum/-uhrzeit, 2. Enddatum/Uhrzeit, 3. Bestellnummer, 4. Rezeptsymbol.)
In dtPDTag habe ich zwei Spalten hinzugefügt – PO und Symbol –, in die ich die Bestellnummer und das Rezeptsymbol (basierend auf dem Datums-/Zeitstempel) hinzufügen wollte.Der JSL-Code, den ich zum Ausführen dieser Aufgabe verwendet habe, ist unten aufgeführt. Ich gehe jedoch davon aus, dass dies eine ziemlich ineffiziente Möglichkeit ist, diese Aufgabe zu verwalten.(Mein Computer schien nicht besonders gut auf die an ihn gestellten Anforderungen zu reagieren!) Es wäre toll, von besseren/effektiveren Möglichkeiten zu hören, wie man eine solche Aufgabe in Zukunft angehen kann.
Mit „am effizientesten“ beziehe ich mich auf eine effektivere Skriptmethode als die Kombination aus zwei for-Schleifen und der einen „if“-Bedingung, die in meiner JSL unten zu sehen ist.
Names Default To Here(1);
dt = Current Data Table();
nr = N Rows(dt); // show(nr);
lstPO = dt:PO << Get Values;
lstSymbol = dt:Symbol << Get Values;
lstStartTime = dt:StartTime << Get Values;
lstEndTime = dt:EndTime << Get Values; // show(lstPO,lstSymbol,lstStartTime,lstEndTime);
dtPDTag = data Table( "2205 - 2209 PD3102" );
nrPD = N Rows(dtPDTag); // show(nrPD);
For(j=1,j<=nr,j++,
_start = lstStartTime[j]; _end = lstEndTime[j]; // show(_start,_end);
_PO =lstPO[j]; _symbol = lstSymbol[j];
For(i=1,i<=nrPD,i++,
If( ( dtPDTag:DateTime[i] > lstStartTime[j] ) & ( dtPDTag:DateTime[i] < lstEndTime[j] ),
dtPDTag:PO[i] = lstPO[j];
dtPDTag:Symbol[i] = lstSymbol[j];
,
);
);
);
Automatisierung und SkripterstellungMassenanpassung