我的原始数据如下:
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创建额外的观察,这些观察不是年度序列中的第一个或最后一个。
我不知道如何开始它。谁能帮助我?我很感激。
答案 0 :(得分:1)
使用by运算符,然后使用第一个和最后一个选项。如果它不是第一个和最后一个,请做额外的输出。数据集需要按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;
答案 1 :(得分:0)
你必须使用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
你也可以查看这个小提琴来执行http://sqlfiddle.com/#!3/e12de/9