标记同时满足两个条件的观察值

时间:2018-08-09 01:52:46

标签: sql sas

我对SAS和SQL还是很陌生,非常感谢您的帮助。

我有一个包含学生ID,学期和audit_type的数据集。每个学期都有2个audit_type,并且学生可以出现在两个审计类型中或两个同时出现。

我需要为每个学期的每个学生id为这3种情况中的每一个创建一个标记:1)如果该学生出现在 only audit_type_1 ,2)如果他/他出现在< strong>仅audit_type_2 和3)在此期间,他/她同时出现在 audit_type_1和audit_type_2上。不确定如何发布我的数据,但是在这里

样本数据

| Id    | Term          | Audit_type    |
|----   |-------------  |-----------:   |
| 1     | Fall 2016     | 1             |
| 1     | Fall 2016     | 2             |
| 2     | Winter 2017   | 1             |
| 3     | Winter 2017   | 2             |
| 4     | Spring 2017   | 1             |
| 4     | Spring 2017   | 2             |

如下所示,我能够使用案例为前两种情况创建一个标记:

proc sql;
create table test as
select id, term, audit_type,
case
when audit_type in ('audit_type_1') then 1
when audit_type in ('audit_type_2 ') then 2
end as audit_type_flag
from have;

我不知道如何标记第三个场景。所有帮助将不胜感激。在此先感谢您的帮助和支持。所以,我想要以下内容:

| Id    | Term          | Audit_type    | Flag  |
|----   |-------------  |-----------:   |------ |
| 1     | Fall 2016     | 1             | 3     |
| 1     | Fall 2016     | 2             | 3     |
| 2     | Winter 2017   | 1             | 1     |
| 3     | Winter 2017   | 2             | 2     |
| 4     | Spring 2017   | 1             | 3     |
| 4     | Spring 2017   | 2             | 3     |

3 个答案:

答案 0 :(得分:0)

只需使用其他else即可解决问题

select id, term, audit_type,
case
when audit_type in ('audit_type_1') then 1
when audit_type in ('audit_type_2 ') then 2
else 3
end as audit_type_flag
from have;

答案 1 :(得分:0)

我在这里在两行之间进行阅读,并假设您使用的逻辑是Audit_Type = 1然后Flag = 1,Audit_Type = 2然后Flag = 2,如果两者均为3,那么我将这些标志加在一起获得了3。这可能不是您要追求的(您可能还需要4、5、6和7标志),这只是基于少量数据并且不知道确切用例的假设,因此,我将提供一个解决方案,如果正确,请告诉我,我将添加解释语法的注释。如果您所要查找的代码不完全是我想要的,我不想花时间解释它。

关于, 斯科特

更新

我已经在代码中添加了注释以及指向页面的链接,这可以帮助您更好地理解我在说什么。

dict = {'fruit': ['apple', 'peach', 'banana'], 'animal': ['cat', 'sheep']}

进一步阅读:

The DOW-loop: a Smarter Approach to your Existing Code

The Sum Statement

The Power of the BY Statement

答案 2 :(得分:0)

我认为您需要汇总:

proc sql;
create table test as
    select id, term, audit_type,
           (case when min(audit_type) <> max(audit_type) then 1
                 when min(audit_type) = 2 then 2
                 when min(audit_type) = 3 then 3
            end) as audit_type_flag
    from have
    group by id, term;