SAS proc sql仅在组内缺失/非缺失中查找最小/最大值

时间:2017-07-14 17:22:37

标签: sql sas

我每IID有多个日期,如果缺少另一个变量,我希望在组中找到最大值(可能是最小值)。获取以下测试数据:

data test;
    informat EFF_DATE END_DATE date9.;
    length IID $12 EFF_DATE END_DATE 8;
    input IID $ EFF_DATE END_DATE;
    format EFF_DATE END_DATE date9.;
    datalines;
    A   11MAY15 .   
    A   12SEP13 01JAN15
    A   13DEC12 .
    B   25AUG14 .   
    B   13JUN17 01JAN15
    B   03NOV13 .
    ;
run;

我的计划是构建以下代码,以便按EFF_DATE计算最大IID,但仅当END_DATE丢失时我无法弄清楚如何在{sql中添加此逻辑{1}}。

proc sql noprint;
    create table test_fill as
    select *,
        max(EFF_DATE) /* add something here? */ as MOST_RECENT_EFF_DATE format=date9.
    from test group by IID;
quit;

以下显示了所需的输出:

IID EFF_DATE    END_DATE    MOST_RECENT_EFF_DATE
A   11MAY15     .           11MAY15
A   12SEP13     01JAN15     11MAY15
A   13DEC12     .           11MAY15
B   25AUG14     .           25AUG14
B   13JUN17     01JAN15     25AUG14
B   03NOV13     .           25AUG14

对于IID = B,即使13JUN17是最大日期,我们也无法接受,因为END_DATE不会丢失,所以我需要采取下一个最高日期。我确信我可以编写一堆数据步骤并合并回去,但如果可能的话,我想尝试在sql中删除它。

1 个答案:

答案 0 :(得分:3)

您在case函数中包含max条件,else为空(永远不是max,也不是min )。

proc sql noprint;
    create table test_fill as
    select *,
        max(case when missing(end_Date) then EFF_DATE else . end) as MOST_RECENT_EFF_DATE format=date9.
    from test group by IID;
quit;