我在SAS中有以下代码:
proc sql;
create table play2
as select a.anndats,a.amaskcd,count(b.amaskcd) as experience
from test1 as a, test1 as b
where a.amaskcd = b.amaskcd and intck('day', b.anndats, a.anndats)>0
group by a.amaskcd, a.ANNDATS;
quit;
数据test1有32个不同的obs,而这个play2只返回22个obs。我想要做的就是每个障碍,计算历史中相同amaskcd的出现次数。解决这个问题的最佳方法是什么?谢谢。
答案 0 :(得分:0)
这将返回22个观察结果 - 这可能实际上与32不同 - 这是一个逗号连接,在这种情况下最终基本上是一个内部连接。对于任何给定行a
,如果没有行b
,后面的anndats
具有相同的amaskcd
,则不会返回a
。< / p>
您要在此处执行的操作是左连接,它会从a
返回所有行。
create table play2
as select ...
from test1 a
left join test1 b
on a.amaskcd=b.amaskcd
where intck(...)>0
group by ...
;
我实际上会这样写,因为我不确定上述内容会完全符合您的要求。
create table play2
as select a.anndats, a.amaskcd,
(select count(1) from test1 b
where b.amaskcd=a.amaskcd
and b.anndats>a.anndats /* intck('day') is pointless, dates are stored as integer days */
) as experience
from test1 a
;
如果你的test1还没有按照amaskcd和anndats分组,你可能需要重做一些。我怀疑,这种子查询更容易编写,更准确地反映了您尝试做的事情。
答案 1 :(得分:0)
如果每个数据集中的anndats变量都是日期类型(不是日期时间),那么你可以简单地做一个等于。 SAS中的日期变量只是整数,其中1表示一天。您不需要使用intck函数来判断天数的差异,只需使用减法。
我注意到的第二件事是你的代码寻找&gt; 0天返回。如果第二个值小于第一个值,则intck函数可以返回负值。
我仍然不确定我是否理解您在查询中要生成的内容。它使用amaskcd字段作为键连接两个数据集。然后根据anndats过滤,只选择b anndats值小于anndats或b.anndats&lt;的记录。 a.anndats。