【问题标题】:Including proc sort in proc sql在 proc sql 中包含 proc 排序
【发布时间】:2017-11-25 10:02:25
【问题描述】:

以下示例数据来自oracle数据库

promo   flag
vijay    a
vijay    b
vijay    c
sam      b
sam      g
sam      c 

我有一个连接到oracle的proc sql语句(虽然我没有在下面提到oracle连接)

proc sql;
create table a as select *from new;
quit;

然后根据上面的数据集a进行两个proc排序语句。

 proc sort data = a;
 by promo descending flag;
 run;
 proc sort data =a nodupkey out =new1;
 by promo;
 run;

现在我想在 proc sql 语句本身中执行这两个 proc sort 语句。知道该怎么做吗?

【问题讨论】:

  • 请展示几条记录的例子,说明你拥有的数据,以及你想要的输出数据。我永远记不起 SORT NODUPKEY 保留了哪条记录。看起来您可能正在尝试为每个 PROMO 值选择一条记录,选择一条具有最大值(或最小值?)值的记录作为标志?
  • 新数据;输入促销$标志$;数据线; vijay a vijay b vijay c sam b sam g sam c ;运行;
  • 首先我需要按促销和降序标志排序,然后为每个促销获取最高标志并将剩余的发送到新数据集 new 1
  • 能否有两条记录具有相同的促销值和相同的标志值?建议编辑您的问题以在其中包含示例数据。对于您的示例数据,答案是否定的,这使得这更容易一些。
  • 如果您希望每个键值组仅获取一条记录,即使它们具有不同的非键变量值,那么 SAS 的 SQL 实现无法做到这一点。如果您将 SQL 推送到数据库中,那么您可以使用较新的 SQL 实现支持的窗口函数来生成行号,并且只为每个组选择第一行。

标签: sas


【解决方案1】:
proc sql;
    create table want as
    select distinct promo,flag from new group by promo having flag=max(flag);
quit;

【讨论】:

  • 如何对数据进行排序?
  • 如何创建出=datatset?
  • CREATE TABLE 子句告诉它创建数据集,在这种情况下,输出数据集是 want。您应该添加一个ORDER BY 子句来指定顺序,但实际上当您使用GROUP BY 时,SAS 会进行排序。 HAVING flag=max(flag) 是在 PROMO 的值中选择具有最大值 flag 的记录,这就是第一个 proc sort with descending 选项为您所做的事情。
  • @geethaan 你想要排序的功能,但你不一定需要排序。在这种情况下,您正在寻找最大值,这就是返回的值。但是,如果您使用的是直通,这可能不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多