【问题标题】:How to create all possible punctuations within a group in SAS如何在 SAS 中的组内创建所有可能的标点符号
【发布时间】:2014-07-27 20:59:59
【问题描述】:

我的原始数据如下:
id co year 1385 1447 1993 1426 1447 2001 * 38 1487 1967 1644 1487 2008 1703 1487 2009 * 1578 1678 1979 150 1678 2002 ** 1069 1690 1989 1070 1690 1993 1652 1690 1996 1596 1690 1997 ** 1542 1704 1977 842 1704 2003

我想创建如下输出:
id co year 1385 1447 1993 1426 1447 2001 * 38 1487 1967 1644 1487 2008 1644 1487 2008 1703 1487 2009 * 1578 1678 1979 150 1678 2002 ** 1069 1690 1989 1070 1690 1993 1070 1690 1993 1652 1690 1996 1652 1690 1996 1596 1690 1997 ** 1542 1704 1977 842 1704 2003

场景是: 当我有超过 3 个 CO 时,我需要为那些不是年份序列中的第一个或最后一个的 CO 创建额外的观察结果

我不知道如何开始。谁能帮助我?非常感谢。

【问题讨论】:

    标签: sql sas data-manipulation


    【解决方案1】:

    使用 by 运算符,然后使用第一个和最后一个选项。如果它不是第一个和最后一个 co,请执行额外的输出。数据集需要按 co 和 year 排序。

    proc sort data=have;
     by co year;
    run;
    
    data want;
     set have;
     by co;
     if not first.co and not last.co then output;
     output;
    run;
    

    【讨论】:

    • 非常感谢!这正是我需要做的。
    【解决方案2】:

    您必须使用 group by 并获取每个 co 的计数,并且在同一表达式中,您还可以获得可以从插入中排除的最小年份和最大年份。

    这里有适合你的解决方案

    以下仅用于创建测试表,不是解决方案的一部分

    create table test
    (
      id int, co int, year int
    )
    
    truncate table test
    insert into test values (1385,1447,1993)
    insert into test values (1426,    1447,    2001)
    insert into test values (38  ,    1487,    1967)
    insert into test values (1644,    1487,    2008)
    insert into test values (1703,    1487,    2009)
    insert into test values (1578,    1678,    1979)
    insert into test values (150 ,    1678,    2002)
    insert into test values (1069,    1690,    1989)
    insert into test values (1070,    1690,    1993)
    insert into test values (1652,    1690,    1996)
    insert into test values (1596,    1690,    1997)
    insert into test values (1542,    1704,    1977)
    insert into test values (842 ,    1704,    2003)
    
    --select 'before',* from test 
    

    这里有解决办法

    ;with C as 
    (
      select min([year]) minimum_year, max([year]) maximum_year, count(1) as Counts, co from test group by co 
    )
    insert into test
    select T.* 
    from C 
    JOIN test T
    ON C.co = T.co
    and c.counts >=3
    and T.[year] <> C.minimum_year
    and T.[year] <> C.maximum_year
    
    select 'after',* from test order by co,id
    

    你也可以查看这个 fiddle 来执行http://sqlfiddle.com/#!3/e12de/9

    【讨论】:

    • 这在 SAS 中不起作用,它不允许 with
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多