SAS是比列中到目前为止的最高数字低的数字

SAS是比列中到目前为止的最高数字低的数字,sas,Sas,我正在使用sas,我的表中有一列由各种数字组成。我想向下一列,如果数字小于目前为止的最高数字,则选择该数字。我贴了一张我正在寻找的例子的照片。我也有一个关于这一年的专栏,如果这很重要的话,我没有在图片中发表。我猜我需要某种循环 例如: n-当前列 输出-期望输出 我在procsql中尝试了这一点,因为我是sas新手,对sql了解更多。当我尝试procsql时,我意识到我将无法在procsql中实现 下面是我在procsql中尝试的内容。 当我尝试更多的循环时,我可以发布更多我尝试过的东西。到现在

我正在使用sas,我的表中有一列由各种数字组成。我想向下一列,如果数字小于目前为止的最高数字,则选择该数字。我贴了一张我正在寻找的例子的照片。我也有一个关于这一年的专栏,如果这很重要的话,我没有在图片中发表。我猜我需要某种循环

例如:

n-当前列 输出-期望输出 我在procsql中尝试了这一点,因为我是sas新手,对sql了解更多。当我尝试procsql时,我意识到我将无法在procsql中实现

下面是我在procsql中尝试的内容。 当我尝试更多的循环时,我可以发布更多我尝试过的东西。到现在为止,我的循环太远了

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;
proc-sql;
选择a*
从家庭作业a
完全加入a.make=b.make上的作业b
a.model=b.model
其中a[初始车型年]
为什么总是使用SQL?SAS有很多功能,通常更适合SQL。SAS的大三学生倾向于使用他们从学校学到的唯一东西:SQL,而忽略了其他所有东西

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

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

尽可能避免直接写循环。数据步骤隐式地在其输入上循环

默认情况下,
数据
步骤为读取的每一行写入一行。您可以使用
delete
语句从输出中删除一行。您还可以编写显式的
输出
语句。那么,只有您执行的
output
的行才会在输出中。(
output
如果您希望输入中每行的输出中有多行,也可以使用。)

但是,默认情况下,“逐行”表示“如果”忘记上一行及其所有相关内容。因此,您需要明确地保留一些信息

注意,默认情况下,SAS保留所有中间计算结果。如果您不想这样做,您需要一个显式
保留
语句,或者一个
删除

示例解决方案:

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; 
数据我的选择;
设置我的输入;
保留最大的0;*仅第一行的最大值初始化为0*;
如果最大值<数字,则最大值=数字;
否则,如果数量<最大值,则输出;
降幅最大;
跑

最后一句话:默认情况下,SQL会编写一个报告,而
数据
步骤会创建一个新的数据集。如果希望SQL充当
数据
步骤,请使用
创建表我的选择作为
进行查询。如果希望
数据
步骤像SQL一样运行,请插入
proc print之前的code>

Hi;欢迎来到这个网站。请包括您为解决此问题而编写的代码,以及所需的文本形式的输入/输出(而不是图像)。有关更多信息,请阅读和。谢谢你问题中的数据令人困惑。为什么39在输出中?不小于22。根据您的描述,我希望所需的输出是一条n=22的记录。从您的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;
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;