2014-10-02 81 views
0

对于初学者我知道我的问题类似于This(这是最接近我的问题,我发现),但同时有一些差异,因此我的新帖子。SAS最有效的方法来消除重复

我有一个标识符和声明的数据库。声明被构造为标识符+字母。 如果标识符是123456,则声明将为“123456A”,“123456B”等

我想为每个标识符选择一个观察值,声明是带有最后一个字母的声明,即当然,并不总是一样的。

我认为我可以做到这一点与一个进程进行排序,然后另外一个与nodupkey:

proc sort data=have out=have2; 
    by identifier declaration /descending; 
run; 

proc sort data=have2 out=want nodupkey; 
    by declaration; 
run; 

,但因为我有一个比较重要的数据库(数以千万计的意见),我想知道什么是最好的如果它是另一个更合适和最快的方法的感觉。 通常情况下,如果有可能在一个步骤。

谢谢

+0

如果你有足够的内存试试上面这可能会更快的链接乔的哈希解决方案。 – Reeza 2014-10-02 13:40:36

+0

你有多少个不同的'identifier'值? – Joe 2014-10-03 18:48:51

+0

我有几百万个不同的标识符。更确切地说,大多数标识符只有一个声明,大约20%有两个,1%左右有三个或更多。 – 2014-10-05 10:15:03

回答

0

这看起来像一个快速解决方案。它只设置第一个观察值(在你的情况下最后一个,因为你已经按降序排序)。意味着其余的记录将不会被加载到程序数据向量中。如果可能的话,请让我知道它是如何去的。我很好奇这是否是最佳选择。我知道这只是在真实中才是真实的。我从来没有在大型数据集上自己测试过。 10X

data want; 
    do until (first.identifier) ; 
     set have; 
     by identifier ; 
    end ; 
run; 
+0

这需要一些OP正在寻求避免的数据。这也可能比你需要的更多的代码(你可以删除'do \ end'并用'if first.identifier;'代替' - 这样做会完全一样。) – Joe 2014-10-03 18:46:01

+0

我测试了它。你是对的,它仍然读取所有的观察结果,如你的建议中的if条件...我猜sql或那个nodupkeys作为海报已经seggusted – criticalth 2014-10-04 05:26:04

0

这应该工作:

proc sql; 
create table want as 
select 
identifier, 
max(declaration) as last_declaration 
from have 
group by identifier; 
quit; 
+0

这不一定是一个坏的解决方案,但它要么[哈希解决方案]或[一种数据]取决于SQL解释器如何决定去做,这看起来像是一件危险的事情 - 前者速度很快,后者速度很慢。 – Joe 2014-10-03 18:45:08

相关问题