Hallo alle,
Ich habe zwei dt und möchte eine neue Spalte im primären dt auf der Grundlage der Daten aus dem sekundären dt erstellen.
Ich möchte einen JSL-Befehl, der das Datum in der Datumsspalte "dt1" überprüft und eine Gruppennummer aus "dt2" basierend auf dem Start- und Enddatum ermittelt. (Zeitrahmen)
dt1: (primär)
| Datum | Gruppe |
| 17.05.2013 13:06 Uhr | |
| 17.05.2013 13:06 Uhr | |
| 23.05.2013 10:02 Uhr | |
| 24.05.2013 13:47 Uhr | |
dt2: (sekundär)
| Gruppe | Anfangsdatum | Endtermin |
| 1 | 17.05.2013 20:15 Uhr | 18.05.2013 8:14 |
| 2 | 18.05.2013 8:15 | 18.05.2013 20:14 Uhr |
| 1 | 18.05.2013 20:15 Uhr | 19.05.2013 8:14 |
| 3 | 19.05.2013 8:15 | 19.05.2013 20:14 Uhr |
| 2 | 19.05.2013 20:15 Uhr | 20.05.2013 8:14 |
| 3 | 20.05.2013 8:15 | 20.05.2013 20:14 Uhr |
| 2 | 20.05.2013 20:15 Uhr | 21.05.2013 8:14 |
| 4 | 21.05.2013 8:15 | 21.05.2013 20:14 Uhr |
| 3 | 21.05.2013 20:15 Uhr | 22.05.2013 8:14 |
| 4 | 22.05.2013 8:15 | 22.05.2013 20:14 Uhr |
| 3 | 22.05.2013 20:15 Uhr | 23.05.2013 8:14 |
| 1 | 23.05.2013 8:15 | 23.05.2013 20:14 Uhr |
| 4 | 23.05.2013 20:15 Uhr | 24.05.2013 8:14 |
| 1 | 24.05.2013 8:15 | 24.05.2013 20:14 Uhr |
Ihre Hilfe wird sehr geschätzt.
Hallo @ileshem ,
Es gibt ein paar Möglichkeiten, wie ich das angehen würde. Eine Möglichkeit besteht darin, eine Tabelle zu erstellen, in der die Gruppen für jeden Zeitpunkt zwischen dem Start- und Enddatum aufgelistet sind. Anschließend können Sie diese Tabelle mit Tabellen> Aktualisieren verwenden, um die Gruppennummer einzugeben, indem Sie direkt mit der neuen Datumsspalte übereinstimmen der Anfang und das Ende. Dazu müsste eine neue überspannte Tabelle erstellt werden, und je nachdem, wie viele Datumsbereiche für diese Tabelle gelten, kann sie sehr groß werden.
Eine andere Option (für die ich in diesem Fall eine Vorliebe habe) ist die Verwendung von Tables> JMP Query Builder, mit der wir einen Join erstellen können, der mithilfe einer SQL-Logik übereinstimmt, wenn ein Datum sowohl nach als auch vor dem Startdatum liegt Endtermin. Sie können diese Abfrage interaktiv gestalten. Dies ist einer der Gründe, warum mir dieser Ansatz gefällt. Wenn Sie also kein Skript erstellen möchten, können Sie dies alles mit der Maus tun. Das Speichern des Skripts führt zu einer JSL-Datei, deren Verallgemeinerung nicht allzu schwierig ist. Es sind lediglich einige Tricks erforderlich, um nur Tabellennamen ohne Erweiterung abzurufen und die Tabellennamen mit evalInsert () einzufügen. Ein bisschen seltsam, und andere haben vielleicht eine elegantere Art, das zu tun, was ich hier getan habe. Das heißt, es ist eine Möglichkeit, keine benutzerdefinierte JSL zu schreiben, um zeilenweise in einer Tabelle nachzuschlagen (was eine dritte und auch völlig akzeptable Methode ist).
Hier ist der Code für JMP Query Builder, und ich habe Ihre Beispieltabellen angehängt, um dies auszuprobieren. Wenn Sie daran interessiert sind, dies interaktiv einzurichten, lassen Sie es mich wissen - es dauert nur 30 Sekunden, um es von Grund auf neu zu erstellen.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>Hallo nochmal, @ileshem ,
Ich erwähnte, dass Sie dies mit benutzerdefiniertem jsl lösen könnten, und wollte eine Möglichkeit teilen, dies mit ein paar For () - Schleifen zu tun, die zeilenweise in Ihrer Primärtabelle arbeiten, um ein Datum zu finden, das Ihren Kriterien in der Sekundärtabelle entspricht. Es gibt Möglichkeiten, dies für sehr große Anwendungen effizienter zu machen, aber dies ist ein Anfang.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@julianisch