0

我正在尝试按升序对每个组的最小值进行排序。我尝试了几种使用分组和排序的不同组合,但无法正确按组排序。最有效的方法是什么?

样本数据

我试过这个:

PROC SQL;
CREATE TABLE NEED AS 
SELECT DISTINCT *
FROM HAVE
GROUP BY ID,VALUE
ORDER BY VALUE;
QUIT; 

使用此输出并认为它会根据 ID 分组进行排序

样本输出

4

3 回答 3

1

默认情况下,SQL Procedure实现汇总统计的自动重新合并。

根据文档

重新合并数据

在 SELECT 子句或 HAVING 子句中使用汇总函数时,您可能会在 SAS 日志中看到以下消息:
NOTE: The query requires remerging summary statistics back with the original data.

重新合并的过程涉及两次数据传递。

在第一轮中,PROC SQL
• 计算并返回汇总函数的值。然后它使用结果来计算汇总函数参与的算术表达式。
• 根据 GROUP BY 子句对数据进行分组。

在第二遍中,PROC SQL 检索它需要在输出中显示的任何其他列和行。

注意:要指定 PROC SQL 不处理使用数据重新合并的查询,请使用 PROC SQL NOREMERGE 选项或 NOSQLREMERGE 系统选项。如果在设置 NOMERGE 选项或 NOSQLREMERGE 系统选项时尝试重新合并,则会将错误写入 SAS 日志。

不依赖于自动重新合并的查询类似于以下示例

proc sql;
  create table want as 
  select all.* from
  (select make, min(msrp) as lowest from sashelp.cars group by make) as sequencer
  join 
  sashelp.cars as all on sequencer.make = all.make
  order by sequencer.lowest, all.make, all.msrp
  ;

LOG窗口将NOTE根据lowest使用方式显示:

NOTE: The query as specified involves ordering by an item that doesn't appear in its SELECT clause.
于 2019-10-21T10:40:53.897 回答
0

你可以尝试一个简单的排序:

proc sort data = have out = want;
  by descending ID value;
run;
于 2019-10-20T06:27:07.320 回答
0

如果你想按最小值排序,那么它需要在每个观察值上。

PROC SQL;
CREATE TABLE NEED AS 
  SELECT DISTINCT *,min(value) as min_value
  FROM HAVE
  GROUP BY ID
  order by min_value,id,value
;
QUIT; 
于 2019-10-20T14:26:46.970 回答