尝试在特定列的Proc Sql语句中选择Distinct

时间:2015-09-04 14:24:46

标签: sas distinct proc-sql

我想在特定列的select distinct语句中使用proc sql。我有大约10列,我不想检查整个10列的重复,我只想检查一列的重复。

因此,当我写下proc sql时,select distinct检查所有10列的重复:

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

我尝试编写类似下面的内容来检查仅复制Col3,并将其他列添加到新表中。但它失败了。我还尝试了不同的组合,例如在select distinct Col3之后添加新的from oldtable,但所有组合都失败了。那么诀窍是什么?

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

1 个答案:

答案 0 :(得分:3)

这不是select distinct的工作原理:它只能从整个return子句中选择不同的值。

不清楚你的意思是检查重复'。假设SAS在您的特定列的某一行上发现重复,它应该选择哪一行?

最简单的方法是,如果你不特别关心哪一行回来,就是使用proc sort nodupkey。 SQL并没有真正做到这一点,特别是ANSI 1999版SAS使用;您可以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;

但更好的解决方案:修复创建副本的原始问题。