繁体   English   中英

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

[英]SAS: how to properly use intck() in proc sql

我在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。 我只想为每个obs计算历史中相同amaskcd的出现次数。 解决此问题的最佳方法是什么? 谢谢。

之所以会返回22个观察值(实际上可能与32个观察值中的22个相差不大),是因为这是一个逗号联接,在这种情况下,它最终基本上是一个内部联接。 对于任何给定行a ,如果没有行b具有更高anndats具有相同amaskcd ,那么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分组,则可能需要重新做一些。 我怀疑,这种子查询更容易编写,并且可以更准确地反映您要执行的操作。

如果每个数据集中的两个变量都为日期类型(而不是日期时间),则可以简单地进行等于。 SAS中的日期变量只是整数,其中1代表一天。 您不需要使用intck函数来区分日期差异,只需使用减法即可。

我注意到的第二件事是您的代码查找了> 0天。 如果第二个值小于第一个值,则intck函数可以返回负值。

我仍然不确定我了解您在查询中产生的结果。 它使用amaskcd字段作为键联接两个数据集。 然后,您将根据注释进行筛选,仅选择b注释值小于anndats或b.anndats <a.anndats的记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM