Sql 按不可见聚合列排序/从结果中排除列

Sql 按不可见聚合列排序/从结果中排除列,sql,plsql,sas,Sql,Plsql,Sas,我需要返回一个表,其中包含前10个最常用的id,其中id使用次数超过1次 示例数据: 二, 2. 2. 1. 1. 1. 1. 3. 3. 4. 4. 5. 六, 前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,其中id使用次数超过1次

示例数据:

二, 2. 2. 1. 1. 1. 1. 3. 3. 4. 4. 5. 六,

前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)
。遗憾的是,我似乎无法找到一种不抛出错误就排除此列的方法

我试过:

答:将聚合直接移动到ORDERBY中(这段代码在普通pl/sql中工作,但在SAS中不工作)

错误:摘要函数仅限于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
);
(按顺序指向)语法错误,应为以下之一:!、!!、&、)、*、***、+、-、/、=,和,EQ,EQT,EXCEPT,GE,GET,GT,GTT,INTERSECT,LE,LET,LT,LTT,NE,NET,NOT,OR,OUTER,UNION,^,^,^=,|,~,~=

删除
orderby
修复了这一问题,但它使我的前10名列表变得毫无用处,因为它实际上不再排序


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

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;
假设不需要表,根据注释,可以使用嵌套查询并将顺序放在子查询之后。您可以按未选择的变量排序,但不能按摘要函数排序

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;

您需要使用SQL还是可以使用PROC FREQ?@Reeza我对SQL更为熟悉,所以我抓住了使用它的机会,因为我对SAS非常陌生。我的数据只是从CSV文件创建的一个简单sas数据集。您认为我可以使用PROC FREQ生成所需的数据吗?将查询放入子查询中,然后在子查询上进行选择以仅拾取id列如何?@kc2018这不是我在示例B中所做的吗?您是否尝试使用此值创建数据集?还是要打印输出?嘿,非常感谢你的帮助和快速回复。第二个解决方案非常适合我的用例。:)
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;