从SAS中B中的A匹配行中删除行

时间:2013-06-18 19:18:45

标签: sql sas sql-delete

由于缺少完整性检查,我目前在主键列上有一个包含多个重复项的表。尽管如此,我试图删除重复项。问题是,没有id列,这意味着找到重复项是非常重要的。

我当前的解决方案涉及使用count(*)... having构造创建第二个表,并选择要删除的行。我的问题是SAS delete命令不允许以下内容:

proc sql;
delete from TableA
where (v1,v2,v3) in TableB

有没有办法根据另一个表的内容从一个表中删除?

3 个答案:

答案 0 :(得分:1)

试试这个:

proc sql;
delete from TableA as a
where a.v1 = (select b.v1 from TableB as b where a.primaryKey = b.foreignKeyForTableA)

等等其他值。但是,由于您可能会从TableB收到重复项(即多个结果),因此您可能需要尝试“select distinct”或“选择Top 1”以仅获得一个结果。

答案 1 :(得分:1)

您可以使用相关子查询执行此操作:

proc sql;
delete from TableA
    where exists (select 1
                  from TableB
                  where b.pk = TableA.v1 or b.pk = TableA.v2 or b.pk = TableA.v3
                 )

答案 2 :(得分:1)

如果我理解正确,您希望从数据集中删除多个观察值,其中多个观察值具有相同的“关键”变量值(删除所有重复值)。

使用SAS执行此操作的最佳和最简单方法是使用“关键”变量对数据集进行排序,然后使用其他数据步骤创建新副本。更难解释而不是说明:

data have;
   input x y z;
   datalines4;
1 2 3
1 2 3
2 3 4
3 4 5
3 4 6
3 4 7
4 5 6
4 5 6
;;;;
run;

proc sort data=have;
   by x y z;
run;

data want;
   set have;
      by x y z;
   if  first.z and last.z;
run; 

子设置IF语句仅使用使用FIRST.语句时创建的自动LAST.BY变量来保留四个“唯一”观察值。

如果您希望保留其中一个重复项,则可以将NODUPKEY选项与PROC SORT一起使用:

proc sort nodupkey data=have out=want2;
   by x y z;
run;

这将消除示例中的两个观察结果,为您的密钥留下唯一的值。您无法使用此技术控制保留哪些观察结果。