由于缺少完整性检查,我目前在主键列上有一个包含多个重复项的表。尽管如此,我试图删除重复项。问题是,没有id
列,这意味着找到重复项是非常重要的。
我当前的解决方案涉及使用count(*)... having
构造创建第二个表,并选择要删除的行。我的问题是SAS delete
命令不允许以下内容:
proc sql;
delete from TableA
where (v1,v2,v3) in TableB
有没有办法根据另一个表的内容从一个表中删除?
答案 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;
这将消除示例中的两个观察结果,为您的密钥留下唯一的值。您无法使用此技术控制保留哪些观察结果。