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

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

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

  1. ColA | ColB | ColC
  2. 1 | a | 0
  3. 1 | a | 1
  4. 1 | b | 0
  5. 1 | b | 0
  6. 2 | a | 0
  7. 2 | a | 0
  8. 2 | b | 0
  9. 2 | b | 0
  10. 3 | a | 0
  11. 3 | a | 0
  12. 3 | b | 1
  13. 3 | b | 0

预期产量:

  1. ColA | ColB | ColC
  2. 1 | b | 0
  3. 1 | b | 0
  4. 2 | a | 0
  5. 2 | a | 0
  6. 2 | b | 0
  7. 2 | b | 0
  8. 3 | a | 0
  9. 3 | a | 0

我试过这样的方法:

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

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

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

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

3vpjnl9f

3vpjnl9f1#

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

  1. proc sql noprint;
  2. create table want as
  3. select *
  4. from have
  5. group by ColA, ColB
  6. having sum(ColC) = 0
  7. ;
  8. quit;
ryevplcw

ryevplcw2#

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

  1. select d.*
  2. from data d
  3. where not exists (select 1
  4. from data d2
  5. where d2.cola = d.cola and d2.colb = d.colb and d2.colc = 1
  6. );

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

3pvhb19x

3pvhb19x3#

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

  1. data have;
  2. input ColA ColB $ ColC;
  3. infile datalines dlm='|';
  4. datalines;
  5. 1 | a | 0
  6. 1 | a | 1
  7. 1 | b | 0
  8. 1 | b | 0
  9. 2 | a | 0
  10. 2 | a | 0
  11. 2 | b | 0
  12. 2 | b | 0
  13. 3 | a | 0
  14. 3 | a | 0
  15. 3 | b | 1
  16. 3 | b | 0
  17. ;
  18. data want (drop=c);
  19. c = 1;
  20. do _n_ = 1 by 1 until (last.ColB);
  21. set have;
  22. by ColA ColB;
  23. if ColC = 1 then c = 0;
  24. end;
  25. do _n_ = 1 to _n_;
  26. set have;
  27. if c then output;
  28. end;
  29. run;
展开查看全部
wsewodh2

wsewodh24#

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

  1. proc sort data=have;
  2. by cola colb;
  3. data want;
  4. merge have (in=in1 where=(colc=1))
  5. have (in=in2)
  6. ;
  7. by cola colb;
  8. if ^in1;
  9. run;

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

eanckbw9

eanckbw95#

此外,哈希对象方法

  1. data want;
  2. if _n_ = 1 then do;
  3. declare hash h (dataset : 'have(where=(ColC=1))');
  4. h.definekey ('ColA', 'ColB');
  5. h.definedone();
  6. end;
  7. set have;
  8. if h.check();
  9. run;

相关问题