2014-10-02 57 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

相關問題