获取两个日期范围之间的记录你好,
我有以下数据表,前 4 列是输入,最后 2 列是所需的输出。 我试图通过匹配 ID = ID 和 Adm.Date = Ref.Date 来连接两个表以合并第 1-3 列和第 4 列。 现在我想要两个输出列(管理员 Date_1 和 Dis_Date_1)如下所示。我需要为范围内的所有 Ref.Date 填充 Adm.Date 和 Dis.Date Adm.Date 和 Dis.Date 以及那些不在日期范围内的缺失值。 我能够得到相应的 Adm。 Date 和 Dis.Date 使用 if 和 lag 函数仅用于下一个后续记录,而不是该范围内的所有记录。 如果有任何方法可以找到解决此问题的合适方法,请告诉我。
提前致谢。
| ID | 管理员 日期 | 日期 | 参考日期 | Adm.Date_1 | Dis.Date_1 |
| 12 | 2/12/2014 | 15/12/2014 | 2/12/2014 | 2/12/2014 | 15/12/2014 |
| 12 | | | 2014 年 3 月 12 日 | 2/12/2014 | 15/12/2014 |
| 12 | | | 2014 年 6 月 12 日 | 2/12/2014 | 15/12/2014 |
| 13 | | | 10/1/2015 | | |
| 13 | 6/1/2016 | 25/1/2016 | 6/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 10/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 11/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 12/1/2016 | 6/1/2016 | 25/1/2016 |
回复:获取两个日期范围之间的记录谢谢你的解决方案。 它工作得很好。回复:获取两个日期范围之间的记录您可以通过对 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] = .
);
);回复:获取两个日期范围之间的记录嗨,威尔登,
感谢您的解决方案。
我希望 Ref.Date 位于该特定 ID 的相应日期范围内。 让我们说第 4 行(ID 13),Ref.Date 在 ID 12 的 Adm.Date 和 Dis.Date 之间,所以它应该是“。”而不是采用 ID 12 的值。 理想情况下,日期应根据 ID 填充,而不是根据以前可用的 Adm.Date 和 Dis.Date 记录填充。 我不确定这个脚本是否会满足这个要求。 感谢您的帮助。 谢谢。
里尼
| ID | 管理员 日期 | 日期 | 参考日期 | Adm.Date_1 | Dis.Date_1 |
| 12 | 2/12/2014 | 15/12/2014 | 2/12/2014 | 2/12/2014 | 15/12/2014 |
| 12 | | | 2014 年 3 月 12 日 | 2/12/2014 | 15/12/2014 |
| 12 | | | 2014 年 6 月 12 日 | 2/12/2014 | 15/12/2014 |
| 13 | | | 13/12/2014 | | |
| 13 | | | 10/1/2015 | | |
| 13 | 6/1/2016 | 25/1/2016 | 6/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 10/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 11/1/2016 | 6/1/2016 | 25/1/2016 |
| 13 | | | 12/1/2016 | 6/1/2016 | 25/1/2016 |
回复:获取两个日期范围之间的记录这是一个通过循环遍历表中的行来处理您的测试用例的解决方案。如果您需要帮助理解代码,请告诉我。
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] = .
);
);