2015-09-04 53 views
1

我想在特定列的proc sql語句中使用select distinct。我有大約10列,我不想檢查整個10列的重複,我只想檢查一列的重複。嘗試在特定列的Proc Sql語句中選擇不同

所以,當我寫的proc sql像下面,select distinct檢查過所有10列的重複:

proc sql; 
    create table newtable as 
     select distinct Col1, Col2, Col3, Col4, ... , Col10 from oldtable; 
quit; 

我試着寫類似下面檢查重複僅爲COL3,太添加其他列進入新表格。但它失敗了。我也嘗試過不同的組合,例如在from oldtable之後添加新的select distinct Col3,但所有組合均失敗。那麼訣竅是什麼?

proc sql; 
    create table newtable as 
     select (distinct Col3), * from oldtable; 
quit; 

回答

3

這不是如何select distinct作品:它只能從整個return語句選擇不同的值。

目前還不清楚「檢查重複」是什麼意思。假設SAS在您的特定列的某一行上找到重複的行,它應該選擇哪一行?

要做到這一點,最簡單的方法就是使用proc sort nodupkey,如果你不特別關心哪一行返回的話。 SQL實際上並沒有這麼做,特別是SAS使用的ANSI 1999版本;您可以使用group by的主變量,並使用maxmin或類似的所有的其他變量,但這並不一定會給你一個真正的行。

如果您確實需要單個實際行,union確實具有自動重複數據刪除功能;所以你可以像這樣使用它。選擇where 0表示沒有選擇,但允許我們使用union

data class_Extra; 
    set sashelp.class; 
    output; 
    if _n_=5 then output; 
run; 

proc sql; 
    create table class_nodup as 
    select * from class_extra where 0 
    union 
    select * from class_extra; 
quit; 

但是更好的解決方案:修復創建副本的原始問題。

+0

問題是我從前面的左連接過程中得到了「重複」,這意味着輸入表就像1000行,而輸出表就像1100行。我期望輸出表格也是1000行,但顯然有些行在左連接後保存了兩次(這就是我稱之爲重複的原因)。 我只想根據只有一列刪除下一步中的重複行。 – user3714330

+1

聽起來像你需要修復左連接過程。 – Joe

+0

,我試圖在左連接過程的前一步中實現'select distinct',但它不起作用。 但是我會檢查'group by',如果它可以幫助我在LEFT加入過程中 – user3714330