2 つの日付範囲間のレコードをフェッチするにはこんにちは、
次のデータテーブルがあり、最初の 4 列が入力で、最後の 2 列が必要な出力です。 ID = ID と Adm.Date = Ref.Date を一致させて、2 つのテーブルを結合して列 1 ~ 3 と列 4 を結合しようとしました。 ここで、2 つの出力列が必要になります (提督。 Date_1 および Dis_Date_1)以下に示すように。範囲内のすべての Ref.Date に対して Adm.Date と Dis.Date を入力する必要があります。 Adm.Date と Dis.Date、および日付範囲に収まらない欠損値。 それぞれのAdmを取得することができました。 if および lag 関数を使用する Date および Dis.Date は、その範囲内のすべてのレコードではなく、次に続くレコードに対してのみ使用されます。 この問題に対する適切な解決策を見つける方法があれば教えてください。
前もって感謝します。
| ID | 提督。 日付 | ディスデート | 参照日 | 管理者日付_1 | 日付_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/12/6 | 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 | 提督。 日付 | ディスデート | 参照日 | 管理者日付_1 | 日付_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/12/6 | 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] = .
);
);