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

时间:2014-12-05 19:02:38

标签: sql sas

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

2 个答案:

答案 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。