我想在特定列的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;
答案 0 :(得分:3)
这不是select distinct
的工作原理:它只能从整个return子句中选择不同的值。
不清楚你的意思是检查重复'。假设SAS在您的特定列的某一行上发现重复,它应该选择哪一行?
最简单的方法是,如果你不特别关心哪一行回来,就是使用proc sort nodupkey
。 SQL并没有真正做到这一点,特别是ANSI 1999版SAS使用;您可以group by
使用主要变量,并使用max
或min
或类似的其他变量所有,但这并不一定会给你一个单一的真实行。
如果您确实想要一个真正的行,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;
但更好的解决方案:修复创建副本的原始问题。