[英]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.