我希望根据标识符,订单和条件消除数据库中的重复项。
更确切地说,我有几个观察数据。我有时候会让一些条件让我想要保持这种观察(让它修复它 condition = 1 ),但是即使这个条件不成立,也要用相同的标识符保持观察(条件= 0 的)。
但是,如果我有一个标识符,其中 condition = 0 的几个观察值,那么我想要删除重复项,标准具有最大的顺序。
没有条件,我可以做到
proc sort data=have;
by identifier descending order;
run;
proc sort nudopkey data=have;
by identifier;
run;
但是如何将我的条件融入其中呢?
编辑1:添加数据库示例:
data Test;
input identifier $ order condition;
datalines;
1023 1 0
1023 2 0
1064 2 0
1064 1 0
1098 1 0
1098 1 1
;
然后我想保留
编辑2:试图确定我的条件
答案 0 :(得分:2)
我假设您只想在标识符的所有记录的条件设置为0时消除重复项。在这种情况下,您希望保留具有最大顺序的记录并消除具有相同标识符的所有其他记录。
Proc sql;
create table want as
select *
from test
group by identifier
having max (condition) ne 0
or order eq max (order)
;
Quit;
这将保留标识符的最大条件= 1的所有行, 或者在最大条件= 0的情况下,选择具有最大顺序的行。
这就是你想要的吗?
答案 1 :(得分:1)
其中一些取决于您如何定义条件'。您的条件是否可以在该标识符的每条记录上轻松验证?然后你可以做这样的事情。
如果该ID中所有记录的条件为真,则所有记录都具有相同的值(flag = 0),by identifier flag;
上的nodupkey将删除附加内容。如果所有记录的条件为false,则不会删除这些记录。如果它对某些人来说是真的而对某些人来说是假的,并且你想要只删除那些带有该标识符的记录(只有那些真实的重复记录),那么你必须确保其中的任何一个。排序为在顶部具有所有condition = true记录,或者有一个单独的标志计数器来确定标志的值(因为它有时会在中间变为0,所以0 0 0 1 2 3 0 4 5 6
就是你想要的,不是0 0 0 1 2 3 0 0 1 2
)。
或许更容易看到是在datastep中执行此操作。排序by identifier descending order
后:
data want;
set have;
by identifier descending order;
if (condition=true) and not (first.identifier) then delete;
run;
如果condition = true始终位于顶部,或者如果它在一个ID组中始终保持一致,则这将再次起作用。如果它不一致且混合,那么你需要跟踪你是否保留了一个真实的地方(假设你想要),或者它可能删除所有真实的记录;使用单独的变量来跟踪您保留的数量。对于该标识符的第一条记录,first.identifier
将为1 / TRUE,而不考虑条件。您也可以创建标志,然后排序by identifier flag descending order;
并保证条件= true位于顶部(通过使flag = 0表示true,或按descending flag
排序。)