こんにちは皆さん、
2つのdtがあり、セカンダリdtからのデータに基づいてプライマリdtに新しい列を作成します。
"dt1" date列の日付をチェックし、開始日と終了日に基づいて "dt2"からのグループ番号を一致させるJSLコマンドが必要です。(時間枠)
dt1 :(プライマリ)
| 日付 | グループ |
| 5/17/2019 13:06 | |
| 5/17/2019 13:06 | |
| 5/23/2019 10:02 | |
| 5/24/2019 13:47 | |
dt2 :(セカンダリ)
| グループ | 開始日 | 終了日 |
| 1 | 5/17/2019 20:15 | 5/18/2019 8:14 |
| 2 | 5/18/2019 8:15 | 5/18/2019 20:14 |
| 1 | 5/18/2019 20:15 | 5/19/2019 8:14 |
| 3 | 5/19/2019 8:15 | 5/19/2019 20:14 |
| 2 | 5/19/2019 20:15 | 5/20/2019 8:14 |
| 3 | 5/20/2019 8:15 | 5/20/2019 20:14 |
| 2 | 5/20/2019 20:15 | 5/21/2019 8:14 |
| 4 | 5/21/2019 8:15 | 5/21/2019 20:14 |
| 3 | 5/21/2019 20:15 | 5/22/2019 8:14 |
| 4 | 5/22/2019 8:15 | 5/22/2019 20:14 |
| 3 | 5/22/2019 20:15 | 5/23/2019 8:14 |
| 1 | 5/23/2019 8:15 | 5/23/2019 20:14 |
| 4 | 5/23/2019 20:15 | 5/24/2019 8:14 |
| 1 | 5/24/2019 8:15 | 5/24/2019 20:14 |
どうぞよろしくお願いします。
こんにちは @ileshem 、
これについてはいくつかの方法があります。1つの方法は、開始日と終了日の間の各時点のグループを一覧表示するテーブルを作成し、そのテーブルをTables> Updateと指定して、新しい日付列に直接またがってグループ番号を取り込むことです。開始と終了 それはその新しいスパンテーブルを作成すること、そしてあなたがそのテーブルを持っているいくつの日付範囲がかなり大きくなることができるかに依存します。
もう1つの選択肢(この場合は優先)は、Tables> JMP Query Builderを使用することです。これにより、開始日の後であってもそれよりも前の日付に一致するSQLロジックを使用できる結合を確立できます。終了日。あなたは対話的にこのクエリを設計することができます、それが私がこのアプローチが好きな理由のひとつです。スクリプトを保存すると、一般化するのは難しくないjslが生成され、拡張子なしでテーブル名だけを取得し、evalInsert()を使用してテーブル名を挿入するためのトリックが必要になります。ちょっと奇妙なこと、そして他の人たちは私がここでやったことをするためのもっとエレガントな方法を持っているかもしれません。それは、別のテーブルでルックアップを実行するために1つのテーブルに1行ずつ移動するカスタムJSLを作成せずに実行する1つの方法です(これは3番目の方法で、まったく問題ありません)。
これがJMP Query Builderのコードです。これを試すためのテーブル例を添付しました。対話的にこれを設定する方法に興味があるなら私に知らせてください - それを最初から構築するのに30秒かかります。
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>また会ったね、 @ileshem 、
私はあなたがカスタムjslでこれを解決することができると述べ、そして二次テーブルであなたの基準を満たす日付を見つけるためにあなたの一次テーブルを通して行ごとに働くいくつかのFor()ループでそれをする一つの方法を共有したいと思いました。非常に大規模なアプリケーションでこれをより効率的に実行する方法はありますが、これは始まりです。
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();
)
)
);
@julian