在我们开始我的问题之前,请注意,我故意没有在这篇文章中包含示例数据,因为我的问题发生在我的整个数据集及其子集上。我有两个数据集,其中包含以下格式的客户端数据。
Have_1
+------------+------------+------+
| dt | dt_next | id |
+------------+------------+------+
| 30.09.2010 | 31.10.2010 | 0001 |
+------------+------------+------+
| 31.10.2010 | 30.11.2010 | 0001 |
+------------+------------+------+
| 30.11.2010 | 31.12.2010 | 0001 |
+------------+------------+------+
| 31.12.2010 | 31.01.2011 | 0001 |
+------------+------------+------+
Have_2
+------+-------+------------+------------+
| id | event | start_date | end_date |
+------+-------+------------+------------+
| 0001 | 1 | 31.10.2010 | 30.11.2010 |
+------+-------+------------+------------+
| 0001 | 2 | 31.10.2010 | 31.12.2010 |
+------+-------+------------+------------+我尝试使用IFN函数通过以下逻辑将1-0个标志放入我的数据集中:
Proc SQL;
Create table want as
Select a.*
,ifn(a.id in (select id from have_2 where a.dt <= end_date and start_date <= a.dt_next), 1, 0) as flg_1
,ifn(a.id in (select id from have_2 where a.dt <= end_date and start_date <= a.dt), 1, 0) as flg_2
From have_1 as a;
Quit;如果我只使用一个客户端,代码工作得很好,但是,如果我使用完整的数据集(甚至是其中的一小部分,例如只有10个客户端),那么代码就会被卡住,因为该过程开始时没有错误,但根本不会结束。我尝试为我的两个输入数据集设置索引,但没有成功。是否有任何特殊的干扰素功能,可以使它这样做?
发布于 2021-05-11 00:51:02
那么,如果任何事件的日期落在这些时间段内,为什么不直接加入并取所有事件的最大值呢?这应该消除了对HAVE1中的每个观察值执行两个子查询的需要。
proc sql;
create table want2 as
select a.id
, a.dt
, a.dt_next
, max(a.dt <= b.end_date and b.start_date <= a.dt_next) as flg1
, max(a.dt <= b.end_date and b.start_date <= a.dt) as flg2
from have1 a
left join have2 b
on a.id = b.id
group by 1,2,3
;
quit;注意:问题出于子查询,而不是IFN()函数调用。这里也不需要使用IFN()函数。SAS计算布尔表达式的值为1或0。因此,表达式a=b返回的结果与IFN(a=b,1,0)返回的结果相同。
https://stackoverflow.com/questions/67468213
复制相似问题