Duplicates SAS是消除重复数据的最有效方法

Duplicates SAS是消除重复数据的最有效方法,duplicates,sas,Duplicates,Sas,对于初学者,我知道我的问题类似于(这是我发现的最接近我的问题),但同时也有一些不同,因此我发表了新的帖子 我有一个带有标识符和声明的数据库。声明构造为标识符+字母。 如果idendifier是123456,那么声明将是“123456A”、“123456B”等等 我想为每个标识符选择一个观察值,声明是最后一个字母,当然,并不总是相同的 我假设我可以使用proc排序,然后使用nodupkey执行另一个排序: proc sort data=have out=have2; by identifi

对于初学者,我知道我的问题类似于(这是我发现的最接近我的问题),但同时也有一些不同,因此我发表了新的帖子

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

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

我假设我可以使用proc排序,然后使用nodupkey执行另一个排序:

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

proc sort data=have2 out=want nodupkey;
    by declaration;
run;
但是,由于我有一个相对重要的数据库(数千万次观测),如果是另一种方法,我想知道更适合和最快的方法。 通常情况下,如果一个步骤可能的话


谢谢

这看起来是一个快速的解决方案。它只设置第一个观察值(在您的情况下是最后一个,因为您已经按降序排序)。这意味着其余的记录甚至不会加载到程序数据向量中。如果可能的话,请告诉我进展如何。我很好奇这是否是最优的。我知道这只有在理论上才是正确的。我从未在大型数据集上亲自测试过它。10倍

data want; 
     do until ( first.identifier ) ; 
         set have; 
         by identifier ;
     end ;
run;
这应该起作用:

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

如果您有足够的内存,请尝试上面链接中的Joe的哈希解决方案,该解决方案可能会更快。您有多少个不同的
identifier
值?我有数百万个不同的标识符。更准确地说,大多数标识符只有一个声明,大约20%的标识符有两个,大约1%的标识符有3个或更多。这不一定是一个坏的解决方案,但它要么是[哈希解决方案],要么是[一种数据],这取决于SQL解释器决定如何执行,这似乎是一件危险的事情——前者速度快,后者的速度太慢了。这需要一种OP希望避免的数据。它也可能比您需要的代码更多(您只需删除
do\end
并替换为
if first.identifier;
——这将实现完全相同的功能。)我测试了它。你是对的,它仍然读取所有观察结果,比如你建议中的if条件。。。我猜是sql还是海报上的点头之笔