SAS的数字低于到目前为止该列中的最高数字

时间:2018-07-26 20:36:04

标签: sas

我正在使用sas,并且我的表中有一列由各种数字组成。我想在该列中向下选择一个数字,如果它小于到目前为止的最大数字。我张贴了我要寻找的示例的图片。我还有关于年份的专栏,如果重要的话,我没有在图片中发布。我猜我将需要某种循环。n is the original column and output is what I would like my loop to do.

示例:

n-当前列

    28
    22
    30
    40
    39
    55
    110
    89
    98
    160
    155
    157
    250

输出-期望的输出

    22
    39
    89
    98
    155
    157

我在proc sql中尝试了此操作,因为我是sas的新手,并且对sql的了解更多。当我尝试proc sql时,我意识到我将无法在proc sql中进行操作。

这是我在proc sql中尝试过的方法。 当我尝试更多循环时,我可以发布更多尝试过的东西。到目前为止,我的循环距离太远了。

proc sql;
  select a.*
  from homework a
  full join homework b on a.make = b.make
    and a.model = b.model
  where a.[Initial Model Year] < b.[Initial Model Year]
    and a.MPH < b.MPH;
quit;

1 个答案:

答案 0 :(得分:0)

为什么总是使用SQL? SAS具有许多通常更适合SQL作业的功能。 SAS的大三学生倾向于使用他们从学校中学到的唯一知识:SQL,而忽略了其余所有知识。

根据定义, SQL不适合此作业! SQL甚至不能保证行顺序是普遍的,更不用说您可以在逻辑中使用输入行的顺序了。 (是的,有些SQL方言可以做到这一点,但不是标准SQL)

使用data步骤。它将按数据的出现顺序逐行读取数据。

尽可能避免写循环。数据步骤隐式地遍历了其输入。

默认情况下,data步骤为读取的每一行写一行。您可以使用delete语句从输出中删除一行。您也可以编写明确的output语句。这样,只有您要对其执行output的行才会出现在输出中。 ({output也用于如果您希望输入的每一行中的输出超过一行。)

但是,默认情况下,逐行表示如果忘记了上一行以及与之相关的所有内容。因此,您需要明确retain一些信息

请注意,默认情况下,SAS保留所有中间计算结果。如果您不想这样做,则需要显式keep语句drop

示例解决方案:

data MY_SELECTION;
    set MY_INPUT;
    retain largest 0; * largest is initialized to 0 for the first row only *;
    if largest < number then largest = number;
    else if number < largest then output;
    drop largest;
run; 

最后的备注:默认情况下,SQL编写一个报告,而data步骤创建一个新的数据集。如果您希望SQL充当data步骤,请在查询前加上create table MY_SELECTION as。如果您希望data步骤像SQL一样,请在proc print;

之前插入run;