SAS:如何在proc sql中正确使用intck()

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的出现次数。解决这个问题的最好办法是什

我在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的出现次数。解决这个问题的最好办法是什么?谢谢

这将返回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