SAS IFN 函数卡住

SAS IFN function gets stuck

在回答我的问题之前请注意,我故意没有在 post 中包含示例数据,因为我的问题出现在我的完整数据集及其子集上。我有两个包含以下格式的客户端数据的数据集。

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 个客户),那么代码就会卡住,因为过程开始了没有错误,但永远不会完成。我尝试为我的两个输入数据集设置索引,但没有成功。 IFN 函数是否有任何特殊之处,可以使其以这种方式运行?

那么,如果任何活动的日期都在这些时间段内,为什么不直接加入并取所有活动的最大值呢?这应该消除了为 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 returns 与 IFN(a=b,1,0) returns.

的结果相同