我有一个受“PROC SQL by Example”启发的宏,它根据单个列/字段找到重复的行:
data have ;
input name $ term $;
cards;
Joe 2000
Joe 2000
Joe 2002
Joe 2008
Sally 2001
Sally 2003
; run;
%MACRO DUPS(LIB, TABLE, GROUPBY) ;
PROC SQL ;
CREATE TABLE DUPROWS AS
SELECT &GROUPBY, COUNT(*) AS Duplicate_Rows
FROM &LIB..&TABLE
GROUP BY &GROUPBY
HAVING COUNT(*) > 1
ORDER BY Duplicate_Rows;
QUIT;
%MEND DUPS ;
%DUPS(WORK,have,name) ;
proc print data=duprows ; run;
我想扩展它以查找基于多列(在我的示例中为第1行和第2行)的重复项,但仍然足够灵活以处理单个列。
在这种情况下,它将运行代码:
proc sql ;
create table duprows as select name,term,count(*) as Duplicate_Rows
from work.have
group by name,term
HAVING COUNT(*) > 1
;quit;
生产:
答案 0 :(得分:2)
要包含任意数量的字段以进行分组,您可以在groupby
宏参数中列出所有字段,但列表必须以逗号分隔并由%quote()
包围。否则SAS会看到逗号,并认为您提供了更多的宏参数。
因此,在您的情况下,您的宏调用将是:
%dups(lib = work, table = have, groupby = %quote(name, term));
由于&groupby
和select
子句中包含group by
,因此列出的所有字段都将显示在输出中,并将用于分组。这是因为当&groupby
结算时,它会成为文本name, term
。