2 つの日付範囲の間のレコードを取得するにはやあ、
最初の 4 列が入力で、最後の 2 列が必要な出力である次のデータ テーブルがあります。 2 つのテーブルを結合して、ID = ID と Adm.Date = Ref.Date を一致させて、列 1-3 と列 4 を結合しようとしました。 ここで、2 つの出力列が必要です (提督 Date_1 および Dis_Date_1)以下に示すように。Adm.Date と Dis.Date が必要です。 Adm.Date と Dis.Date、および日付範囲に収まらないものについては欠損値。 それぞれの Adm を取得できました。 その範囲内のすべてのレコードではなく、次の次のレコードに対してのみifおよびlag関数を使用するDateおよびDis.Date。 この問題の適切な解決策を見つける方法があれば教えてください。
前もって感謝します。
| ID | 提督 日にち | 廃止日 | 参照日 | Adm.Date_1 | Dis.Date_1 |
| 12 | 2014 年 2 月 12 日 | 2014/12/15 | 2014 年 2 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 12 | | | 2014 年 3 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 12 | | | 2014 年 6 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 13 | | | 2015 年 10 月 1 日 | | |
| 13 | 2016/6/1 | 2016/1/25 | 2016/6/1 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 10 月 1 日 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 11 月 1 日 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 12 月 1 日 | 2016/6/1 | 2016/1/25 |
Re: 2 つの日付範囲の間のレコードを取得するには解決策をありがとう。 それは完璧に機能しました。Re: 2 つの日付範囲の間のレコードを取得するにはID のいくつかの論理チェックを使用すると、非常に簡単に対応できます。
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
id_temp = :ID[1];
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
If(!Is Missing(:Name("Adm. Date")[i]),
//Execute if new Adm. Date
ad_date_temp = :Name("Adm. Date")[i];
dis_date_temp = :Name("Dis. Date")[i];
id_temp = :ID[i],
);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp & :ID[i] == id_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);Re: 2 つの日付範囲の間のレコードを取得するにはこんにちは。
あなたの解決策をありがとう。
Ref.Date がその特定の ID のそれぞれの日付範囲にあることを望みます。 行 4 (ID 13) の場合、Ref.Date は ID 12 の Adm.Date と Dis.Date の間にあるため、"." である必要があります。 ID 12 の値を取る代わりに。 理想的には、日付は、利用可能な以前の Adm.Date および Dis.Date レコードではなく、ID に基づいて入力する必要があります。 このスクリプトがこの要件を処理するかどうかはわかりません。 これであなたの助けに感謝します。 ありがとう。
リニ
| ID | 提督 日にち | 廃止日 | 参照日 | Adm.Date_1 | Dis.Date_1 |
| 12 | 2014 年 2 月 12 日 | 2014/12/15 | 2014 年 2 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 12 | | | 2014 年 3 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 12 | | | 2014 年 6 月 12 日 | 2014 年 2 月 12 日 | 2014/12/15 |
| 13 | | | 2014/12/13 | | |
| 13 | | | 2015 年 10 月 1 日 | | |
| 13 | 2016/6/1 | 2016/1/25 | 2016/6/1 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 10 月 1 日 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 11 月 1 日 | 2016/6/1 | 2016/1/25 |
| 13 | | | 2016 年 12 月 1 日 | 2016/6/1 | 2016/1/25 |
Re: 2 つの日付範囲の間のレコードを取得するにはテーブル内の行をループすることにより、テスト ケースで機能するソリューションを次に示します。コードを理解するのに助けが必要な場合はお知らせください。
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
ad_date_temp = If(IsMissing(:Name("Adm. Date")[i]),ad_date_temp, :Name("Adm. Date")[i]);
dis_date_temp = If(IsMissing(:Name("Dis. Date")[i]),dis_date_temp, :Name("Dis. Date")[i]);
Show(i, ad_date_temp, dis_date_temp);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);