如何跨级别计算重复值

时间:2018-12-07 03:34:52

标签: sql sas

这是我的数据集的一个示例:

data have;  
input v1 v2 $;
cards; 
2015  123
2015  5a2
2015  544
2015  546
2015  678
2015  989
2016  123
2016  123
2016  222
2016  434
2016  444
2016  586
2016  675
2016  970
2016  98
2017  123
2017  123
2017  345
2017  544
2017  544
2017  675
;;;;
run;

我的目标是找出2017年和/或2015年和2016年重复值出现的比率。例如,如果“ 123”在2017年出现n次,我想计算2017年的每次重复发生,但我想计算一次在2015年或2016年发生的次数。因此,在样本数据的情况下,“ 123”的比率为0.5。因为它在2017年发生过两次,在其他两年中至少发生过一次,因此我们对2017年有6次观测。

我是sql的新手,并且一直在尝试构建此代码,但这显然对计算v1的级别没有帮助。

 proc sql;
    select count(distinct v1) as variablewant 
            from have
                group by v1
;
quit;

谢谢。

编辑:

我想要的输出如下:

2017:.8333

这是因为2017年6个值中的5个发生在2017年或前两年之一。

1 个答案:

答案 0 :(得分:0)

您可以执行自反(即自我)连接以获得结果。对于left join,如果右表不满足on条件,则所引用的任何右列将为null。 case语句中使用了这一事实,以计算前几年发生的v2的数量。

proc sql;
  create table want as
  select 
    year, sum (case when BUTTER.v2 is not null then 1 else 0 end) / count (*) as ratio
  from
    have as PEANUT
  left join
    (select distinct v2 from have where year < 2017) as BUTTER
  on
    PEANUT.v2 = BUTTER.v2
  where 
    year = 2017
  group by
    year
  ;