SAS按顺序查找变量

SAS按顺序查找变量,sas,Sas,我需要找出谁拥有A-B-C订单。例如,请查看表格 id term grade subj num 10 2002 D 332 1 10 2002 A 333 2 11 2005 C 232 1 11 2005

我需要找出谁拥有A-B-C订单。例如,请查看表格

 id          term        grade      subj      num
 10         2002        D            332        1 
 10         2002        A             333      2
 11         2005        C             232       1 
 11         2005        A             232       2
 11         2005        B             232       3
 11         2005        C             232       4
 15         2010       A              130       1
 15         2010       B               130      2
 15         2010       C              130       3 
 20         2000       B             500        1
 20         2000       A             500        2
 20         2000       C             500        3    
我需要这张桌子上的id:11和15

输出应该是

   id   term   subj
   11   2005   232
   15  2010    130 
所以我需要列出等级为“A”的id,然后改为“B”,然后改为“C”。 Num可能是正常的。它不必从1开始,它可以是1、2或3,等等,但它应该是顺序A、B、C
我不需要看到ID=20的bec,因为num order grades'不符合顺序。

如果您只需要一个简单的'a'-'B'-'C'序列,那么
LAG()
函数就足够了。这就是我在下面的例子中所展示的。如果您正在寻找更多的序列(例如“A”-“B”,“B”-“C”,“A”-“B”-“C”-“D”),则需要稍微复杂一点的解决方案。如果是,我将相应地编辑答案

下面是一个显示实现的测试程序:

DATA d1;
    INPUT
        id  :8.
        term    :8.
        grade   :$2.
        subj    :8.
        num     :8.
    ;

    DATALINES;
         10         2002        D            332        1 
         10         2002        A             333      2
         11         2005        C             232       1 
         11         2005        A             232       2
         11         2005        B             232       3
         11         2005        C             232       4
         15         2010       A              130       1
         15         2010       B               130      2
         15         2010       C              130       3 
    ;
RUN;



DATA d2 (
    KEEP = id term subj
);
    SET d1;

    grade_previous_1 = LAG1(grade);
    grade_previous_2 = LAG2(grade);

    IF (grade = 'C' AND grade_previous_1 = 'B' AND grade_previous_2 = 'A');
RUN;
请注意,
LAG
函数必须在它们自己的行上求值并存储在变量中,如上所示-如果条件不满足,请不要将它们折叠到
中,否则它们不会始终得到执行。也就是说,不要说:

IF (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');

这在本例中确实有效,但一般来说,最好养成在
IF
条件之外调用
LAG()
并将结果存储在临时变量中的习惯。

如果您只需要一个简单的'a'-'B'-'C'序列,那么
LAG()
函数就足够了。这就是我在下面的例子中所展示的。如果您正在寻找更多的序列(例如“A”-“B”,“B”-“C”,“A”-“B”-“C”-“D”),则需要稍微复杂一点的解决方案。如果是,我将相应地编辑答案

下面是一个显示实现的测试程序:

DATA d1;
    INPUT
        id  :8.
        term    :8.
        grade   :$2.
        subj    :8.
        num     :8.
    ;

    DATALINES;
         10         2002        D            332        1 
         10         2002        A             333      2
         11         2005        C             232       1 
         11         2005        A             232       2
         11         2005        B             232       3
         11         2005        C             232       4
         15         2010       A              130       1
         15         2010       B               130      2
         15         2010       C              130       3 
    ;
RUN;



DATA d2 (
    KEEP = id term subj
);
    SET d1;

    grade_previous_1 = LAG1(grade);
    grade_previous_2 = LAG2(grade);

    IF (grade = 'C' AND grade_previous_1 = 'B' AND grade_previous_2 = 'A');
RUN;
请注意,
LAG
函数必须在它们自己的行上求值并存储在变量中,如上所示-如果
条件不满足,请不要将它们折叠到
中,否则它们不会始终得到执行。也就是说,不要说:

IF (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');

这在本例中确实有效,但一般来说,最好养成在
IF
条件之外调用
LAG()
并将结果存储在临时变量中的习惯。

您的示例输出不显示等级。在我看来,您只需要包含“A”-“B”-“C”序列的记录集的
id
术语和
sub
,不是吗?另外,我缩短了代码。是的,正如你提到的,它不符合顺序。为了“num”,我需要这个。如果我删除“如果”(grade'部分,我需要添加什么?不要担心第一条评论,我删除了。我犯了错误。但我需要输出的顺序是A,然后是B,然后是COK,这与当前的样本输出不同。你是说你想要每个'A'-'B'-'C'序列的所有记录吗?如果是,请更改样本输出,以便我确定你的意思和n我会继续修改答案。我修改了。我又添加了一个id=20,我不需要看到它。因为它不符合顺序。清楚吗?你的样本输出没有显示分数。在我看来,你似乎只需要包含“A”-“B”-“C”序列的记录集的
id
term
subc
,不?而且,我缩短了内德的代码。是的,正如你提到的,它是不符合顺序的。我需要在顺序'num'。如果我删除'if'(grade'部分,我需要添加什么?不要担心第一条评论,我删除了。我犯了错误。但我需要输出的顺序是A,然后是B,然后是COK,这与当前的样本输出不同。你是说你想要每个'A'-'B'-'C'序列的所有记录吗?如果是,请更改样本输出,以便我确定你的意思和我会继续改变答案。我改变了。我又增加了一个id=20,我不需要看到它。因为它不符合顺序。明白吗?