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.
的结果相同
在回答我的问题之前请注意,我故意没有在 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.