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