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