【问题标题】:SAS Most efficient way to eliminate duplicateSAS 消除重复的最有效方法
【发布时间】:2014-10-02 08:54:32
【问题描述】:

首先,我知道我的问题类似于This(这是我发现的最接近我的问题),但同时有一些差异,因此我的新帖子。

我有一个带有标识符和声明的数据库。声明构造为标识符 + 一个字母。 如果标识符是 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;

但由于我有一个相对重要的数据库(数以千万计的观察),我想知道如果它是另一种更适合和最快的方法,那么我想知道最好的方法。 通常,如果可以一步完成。

谢谢

【问题讨论】:

  • 如果您有足够的内存,请尝试上面链接中 Joe 的哈希解决方案,这可能会更快。
  • identifier 有多少个不同的值?
  • 我有数百万个不同的标识符。更准确地说,大多数标识符只有一个声明,大约 20% 有两个,1% 左右有 3 个或更多。

标签: duplicates sas


【解决方案1】:

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

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

【讨论】:

  • 这需要某种数据,而 OP 希望避免这种数据。它也可能比您需要的代码更多(您可以删除 do\end 并替换为 if first.identifier; - 这将完成完全相同的事情。)
  • 我测试过了。你是对的,它仍然会读取所有观察结果,比如你建议中的 if 条件......我猜是 sql then 或 nodupkeys,因为海报已经seggusted
【解决方案2】:

这应该可行:

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

【讨论】:

  • 这不一定是一个糟糕的解决方案,但它要么是 [哈希解决方案] 要么是 [一种数据],具体取决于 SQL 解释器如何决定这样做,这似乎很危险事情 - 前者很快,后者太慢了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2017-10-18
  • 2018-04-02
  • 2015-08-02
  • 2011-08-14
  • 2020-11-22
相关资源
最近更新 更多