在sas/sql中按条件删除由两个变量组成的组

dohp0rv5  于 2021-07-26  发布在  Java
关注(0)|答案(5)|浏览(452)

我正在为下面的问题寻找解决办法。我使用的是sas,因此基本的sql或datastep方法都是受欢迎的。也许解决方法很简单,但我对sas有点陌生,找不到解决方法。
我得到了一个数据集,想通过一个条件删除第二级的子组。为了更简单,让我举个例子来解释。条件是:当colc中的任何值为1时,删除maingroup中的子组。主群是cola,子群是colb

ColA | ColB | ColC
  1  |  a   |  0  
  1  |  a   |  1  
  1  |  b   |  0  
  1  |  b   |  0  
  2  |  a   |  0  
  2  |  a   |  0  
  2  |  b   |  0  
  2  |  b   |  0  
  3  |  a   |  0  
  3  |  a   |  0  
  3  |  b   |  1  
  3  |  b   |  0

预期产量:

ColA | ColB | ColC
  1  |  b   |  0  
  1  |  b   |  0  
  2  |  a   |  0  
  2  |  a   |  0  
  2  |  b   |  0  
  2  |  b   |  0  
  3  |  a   |  0  
  3  |  a   |  0

我试过这样的方法:

select * from data
group by ColA, ColB having ColC <> 1

我想,将按两列分组,并选择不带colc=1的所有组。但它只“删除”colc=1的行。
另一种方法是这样的:

select * from data
where ColA in (select ColA from data where ColC <> 1)

当然,我不能用这个联系到小组。我也在考虑加入,但不知道怎么做。

3vpjnl9f

3vpjnl9f1#

这个 having sql中的子句将允许您通过摘要函数筛选查询。下面的查询表示只包含 ColC 分组依据后为0 ColA 以及 ColB .

proc sql noprint;
    create table want as 
        select *
        from have
        group by ColA, ColB
        having sum(ColC) = 0
    ;
quit;
ryevplcw

ryevplcw2#

你可以用 not exists 使用相关子查询:

select d.*
from data d
where not exists (select 1
                  from data d2 
                  where d2.cola = d.cola and d2.colb = d.colb and d2.colc = 1
                 );

这将保留所有 cola / colb 没有一个 1colc .
这也可以适用于 delete ,但您似乎需要筛选的结果集。

3pvhb19x

3pvhb19x3#

这里是一个使用双道循环的数据步方法

data have;
input ColA ColB $ ColC;
infile datalines dlm='|';
datalines;
  1  |  a   |  0  
  1  |  a   |  1  
  1  |  b   |  0  
  1  |  b   |  0  
  2  |  a   |  0  
  2  |  a   |  0  
  2  |  b   |  0  
  2  |  b   |  0  
  3  |  a   |  0  
  3  |  a   |  0  
  3  |  b   |  1  
  3  |  b   |  0  
;

data want (drop=c);
    c = 1;
    do _n_ = 1 by 1 until (last.ColB);
        set have;
        by ColA ColB;
        if ColC = 1 then c = 0;
    end;
    do _n_ = 1 to _n_;
        set have;
        if c then output;
    end;
run;
wsewodh2

wsewodh24#

使用通用代码的简单方法:

proc sort data=have;
   by cola colb;

data want;
   merge have (in=in1 where=(colc=1))
         have (in=in2)
         ;
   by cola colb;       
   if ^in1;
run;

第一个have选择colc=1的所有记录,由于我们正在按cola和colb合并,if语句将删除具有相同cola和colb的所有记录,这就是目标。

eanckbw9

eanckbw95#

此外,哈希对象方法

data want;
    if _n_ = 1 then do;
        declare hash h (dataset : 'have(where=(ColC=1))');
        h.definekey ('ColA', 'ColB');
        h.definedone();
    end;
    set have;
    if h.check();
run;

相关问题