我需要返回一个包含前10个最常用ID的表,其中id的使用次数超过1次。
示例数据:
2 2 2 1 1 1 1 3 3 4 4 五 6
前10名:
1 2 3 4(不再是由于示例数据)
这是我的疑问:
proc sql outobs=10;
SELECT id, count(id) as COLX
FROM output
GROUP BY id
HAVING count(id) GT 1
ORDER BY COLX DESC;
这完美无缺。它返回输出中出现最多的10个ID。 但是,我不想在输出中包含count(id)
。可悲的是,我似乎无法在不抛出错误的情况下找到排除此列的方法。
我尝试过:
答:将聚合直接移动到ORDER BY(这个确切的代码可以在vanilla pl / sql中运行,但不能在SAS中运行。)
proc sql outobs=10;
SELECT id
-- SELECT id, count(id) as COLX
FROM output
GROUP BY id
HAVING count(id) GT 1
ORDER BY count(id) DESC;
-- ORDER BY COLX DESC;
错误:摘要函数仅限于SELECT和HAVING子句。
B:将查询移动到子查询中,然后选择我需要的列。
proc sql outobs=10;
SELECT id FROM (
SELECT id, count(id) as COLX
FROM output
GROUP BY id
HAVING count(id) GT 1
ORDER BY COLX DESC
);
(指向ORDER BY)语法错误,需要以下其中一项:!,!!,&,),*,**,+, - ,/,<,&lt ; =,<&gt ;, =,>,> =,AND,EQ,EQT,EXCEPT,GE,GET,GT,GTT,INTERSECT,LE,LET,LT,LTT,NE,NET,NOT,OR ,OUTER,UNION,^,^ =,|,||,〜,〜=。
删除ORDER BY
会修复此问题,但这会使我的前十名列表无效,因为它实际上不再排序。
有谁知道为什么这会让我如此悲伤?它确实是一个非常简单的查询,这个查询因这一要求而变得复杂。任何帮助将不胜感激。
答案 0 :(得分:2)
IMO最快的方式是使用SAS数据步骤选项KEEP,这在您创建数据集时有效。如果您不想要数据集,那么您将需要另一个选项。
data have;
input id @@;
cards;
2 2 2 1 1 1 1 3 3 4 4 5 6
;;;;
run;
proc sql outobs=10;
create table want (keep=id) as
SELECT id, count(id) as COLX
FROM have
GROUP BY id
HAVING count(id) GT 1
ORDER BY COLX DESC;
quit;
proc print data=want;
run;
假设您不想要任何表,根据您的注释,您可以使用嵌套查询并在子查询后面放置ORDER。您可以按照未选择的变量排序,但不能按汇总函数排序。
proc sql outobs=10;
select id from (
SELECT id, count(id) as COLX
FROM have
GROUP BY id
HAVING count(id) GT 1)
order by colx desc;
quit;