我需要找到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 AND 15
输出应该像
id term subj
11 2005 232
15 2010 130
所以我需要列出其中包含“A”等级的ID,然后将其更改为“B”,然后将其更改为“C”。 Num可能是有序的。它不必从1开始,它可以是1或2或3等。但它应该是顺序A然后B然后C 我不需要看到ID = 20因为num order等级'不合适。
答案 0 :(得分:0)
如果您正在寻找的只是一个简单的' - ' B' - ' C'序列,然后LAG()
函数就足够了。这就是我在下面的例子中展示的内容。如果您正在寻找更多序列(例如' A' - ' B',' B' - ' C',' A& #39; - ' 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
条件中,否则它们不会被取消永远都会被执行也就是说,不要说:
IF (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');
这实际上适用于此示例,但一般来说,养成在LAG()
条件之外调用IF
并将结果存储在临时变量中的习惯会更好。