SAS:如何在proc sql中正确使用intck()
我在SAS中有以下代码:SAS:如何在proc sql中正确使用intck(),sql,sas,Sql,Sas,我在SAS中有以下代码: proc-sql; 创建表格播放2 选择a.anndats、a.amaskd、count(b.amaskd)作为经验 从test1作为a,test1作为b 其中a.amaskcd=b.amaskcd和intck('day',b.anndats,a.anndats)>0 a.amaskd、a.ANNDATS分组; 退出 数据test1有32个不同的ob,而这个play2只返回22个ob。我只想为每个obs计算历史上同一个amaskcd的出现次数。解决这个问题的最好办法是什
proc-sql;
创建表格播放2
选择a.anndats、a.amaskd、count(b.amaskd)作为经验
从test1作为a,test1作为b
其中a.amaskcd=b.amaskcd和intck('day',b.anndats,a.anndats)>0
a.amaskd、a.ANNDATS分组;
退出代码>
数据test1有32个不同的ob,而这个play2只返回22个ob。我只想为每个obs计算历史上同一个amaskcd的出现次数。解决这个问题的最好办法是什么?谢谢 这将返回22个观察值(实际上可能与32个观察值不同)的原因是这是一个逗号连接,在本例中,它基本上是一个内部连接。对于任何给定的行a
,如果没有行b
具有具有相同amaskcd
的后续anndats
,则不会返回该a
这里要做的是一个左连接,它一次返回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分组,那么您可能需要对其进行一些修改。我猜想,这种子查询更容易编写,并且更准确地反映了您正在尝试执行的操作。如果每个数据集中的anndats变量都是日期类型(而不是日期时间),那么您可以简单地执行相等操作。SAS中的日期变量只是整数,其中1表示一天。您不需要使用intck函数来显示天数差异,只需使用减法即可
我注意到的第二件事是,您的代码查找返回的>0天。如果第二个值小于第一个值,intck函数可以返回负值
我仍然不确定我是否理解您希望在查询中生成的内容。它使用amaskcd字段作为键连接两个数据集。然后,根据ANNDAT进行过滤,仅选择b ANNDAT值小于a ANNDAT或b.ANNDAT