2015-09-04 49 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