按不可见的汇总列排序/从结果

时间:2018-01-03 22:06:57

标签: sql plsql sas

我需要返回一个包含前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会修复此问题,但这会使我的前十名列表无效,因为它实际上不再排序。

有谁知道为什么这会让我如此悲伤?它确实是一个非常简单的查询,这个查询因这一要求而变得复杂。任何帮助将不胜感激。

1 个答案:

答案 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;