異なるシナリオの同じ列の日差こんにちは。以下のようなさまざまなシナリオについて質問があります。 助けていただければ幸いです。
シナリオA : この最後の列を追加して、そのユーザー ID との日の差を計算したいと思います。初めウェブから初め予約日。 予約アクションの前に Web アクションがなかった場合は、空のままにしておきます。 jslではなく関数を使用した場合の数式がどのようになるかを誰かが助けてくれませんか?
| ユーザーID | アクション | 日付 | 最初のウェブ日から最初の予約日まで |
| 2523 | ウェブ | 2018-05-06 | 22 |
| 2523 | ウェブ | 2018-05-16 | 22 |
| 2523 | 予約 | 2018-05-28 | 22 |
| 2523 | 予約 | 2018-06-08 | 22 |
| 2523 | ウェブ | 2018-07-08 | 22 |
| 2523 | 予約 | 2018-08-08 | 22 |
シナリオ B :上記の表に基づいて、各ユーザーID、間の日の差を含む以下のような別の表を計算したいと考えています。最初の Web アクション日」「予約前」に各予約日。 ロジックに基づくと、上記の表を入力として使用した理想的な結果は次のようになります。このユーザー ID の 3 つの日差のインスタンスになります。 シナリオ A と同様に、予約前に Web を使用する場合のみを考慮します。
| ユーザーID | 実例 | 計算 |
| 2523 | 22 | 5/28 マイナス 5/6 |
| 2523 | 33 | 6/8 マイナス 5/6 |
| 2523 | 31 | 8/8 マイナス 7/8 |
ありがとう!
品質およびプロセスエンジニアリングRe: 異なるシナリオの同じ列の日差それは動作します! ゲオルグさん、本当にありがとうございました! Matrix と Loc のリンクから学習します。 本当にありがとうございました。Re: 異なるシナリオの同じ列の日差こんにちは@ジョアン、申し訳ありませんが、これは完全なサービスを提供するプラットフォームではありませんが、サポートできれば幸いです。 したがって、詳しく知りたい場合は、ここで使用されている関数に関するオンライン ドキュメントを参照してください。
たとえば、loc は特定の値のベクトルのインデックスを提供します。
Loc 関数 (jmp.com)
両方のシナリオについては、以下のスクリプトを参照してください。 シナリオ B は非常に似ています...
説明したとおりのシナリオ B の正確な表が必要な場合は、式 (値が保持されている) を削除し、「式 B」列で欠落している値を選択して削除できます。
BR
names default to here(1);
// create the example table
New Table( "20210404_user_web_booking_matrixexample",
Add Rows( 12 ),
Compress File When Saved( 1 ),
New Column( "userID",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2523, 2523, 2523, 2523, 2523, 2523, 2540, 2540, 2540, 2540, 2540, 2540]
),
Set Display Width( 66 )
),
New Column( "action",
Character( 16 ),
"Nominal",
Set Values(
{"web", "web", "booking", "booking", "web", "booking", "web", "web",
"booking", "booking", "web", "booking"}
),
Set Display Width( 73 )
),
New Column( "date",
Numeric,
"Continuous",
Format( "y/m/d", 12 ),
Input Format( "y/m/d" ),
Set Values(
[3608409600, 3609273600, 3610310400, 3611260800, 3613852800, 3616531200,
3647462400, 3647548800, 3647635200, 3647721600, 3647808000, 3647894400]
),
Set Display Width( 92 )
),
New Column( "first web date to first booking date",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [22, 22, 22, 22, 22, 22, ., ., ., ., ., .] ),
Set Display Width( 150 )
),
New Column( "formula_A",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
// convert columns to vectors
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
// get a vector with subscripts of current userID
user_index = user_vec == :userID[Row()];
// get a vctor with subscripts where action=web
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
// get a vector with dates for current userID and action=web
web_dat = dat_vec[Loc( user_index & web_index )];
// the same for booking (actually not web)
booking_dat = dat_vec[Loc( user_index & !web_index )];
// calculate minimum of both date vectors and subtract
(Minimum( booking_dat ) - Minimum( web_dat )) / (3600 * 24);
),
Set Display Width( 146 )
),
New Column( "formula_B",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
user_index = user_vec == :userID[Row()];
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
web_dat = dat_vec[Loc( user_index & web_index )];
booking_dat = dat_vec[Loc( user_index & !web_index )];
// when current action is booking, then subtract minimum web date, otherwise keep empty, and divide seconds by seconds of day
If( :action == "booking", :date - Minimum( web_dat ), . ) / (3600 * 24);
),
Set Selected
)
);Re: 異なるシナリオの同じ列の日差ゲオルグさん、ありがとう! それは動作します。 このスクリプトの背後にあるロジックを説明してもらえますか? ここでの Matrix と Loc についてはあまり詳しくありません。
シナリオ 2 の解決策はありますか?
ありがとう!Re: 異なるシナリオの同じ列の日差ティエリーさん、ありがとう! 結果は良さそうです! トランザクション ID が何をしているのか説明していただけますか? 論理や公式がわかりません。
シナリオ B の解決策はありますか? シナリオ B では、2 番目の予約が重要です。
ありがとう!Re: 異なるシナリオの同じ列の日差シナリオ A には次の式が当てはまると思います。
まだ最適化されていませんが、このようなことがどのように行われるかを示すかもしれません。
数式の中でいくつかの単純な JSL を段階的に使用します。

テーブル生成の完全なスクリプトを参照してください。
New Table( "20210404_user_web_booking_matrixexample",
Add Rows( 12 ),
Compress File When Saved( 1 ),
New Column( "userID",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2523, 2523, 2523, 2523, 2523, 2523, 2540, 2540, 2540, 2540, 2540, 2540]
),
Set Display Width( 66 )
),
New Column( "action",
Character( 16 ),
"Nominal",
Set Values(
{"web", "web", "booking", "booking", "web", "booking", "web", "web",
"booking", "booking", "web", "booking"}
),
Set Display Width( 73 )
),
New Column( "date",
Numeric,
"Continuous",
Format( "y/m/d", 12 ),
Input Format( "y/m/d" ),
Set Values(
[3608409600, 3609273600, 3610310400, 3611260800, 3613852800, 3616531200,
3647462400, 3647548800, 3647635200, 3647721600, 3647808000, 3647894400]
),
Set Display Width( 92 )
),
New Column( "first web date to first booking date",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [22, 22, 22, 22, 22, 22, ., ., ., ., ., .] ),
Set Display Width( 150 )
),
New Column( "formula",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
user_index = user_vec == :userID[Row()];
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
web_dat = dat_vec[Loc( user_index & web_index )];
booking_dat = dat_vec[Loc( user_index & !web_index )];
(Minimum( booking_dat ) - Minimum( web_dat )) / (3600 * 24);
),
Set Selected
)
)Re: 異なるシナリオの同じ列の日差こんにちは、ジョアンさん
少し試してみた結果、目的の出力を生成する一連の列式を生成することができました (添付を参照)。 重要なのは、数式が正しく機能するには、テーブルを「userId」と「日付」で並べ替える必要があることです。
最高、
TS
Re: 異なるシナリオの同じ列の日差こんにちは、ジョアンさん
簡単な解決策が開発できるかどうかを確認するためのいくつかの質問:
1) 最初のシーケンス (行 1 ~ 4) と 2 番目のシーケンス (行 4 ~ 6) を区別する列はありますか。これがないと、2 セットのトランザクションを区別する列式を作成するのが少し難しくなります。
2) 私の理解が正しければ、2 番目の予約日 (行 4) はあなたの質問とは関係ありません。
ご都合がつきましたらお早めにご連絡ください。
最高、
TS