2015-04-12 25 views
0
NAME DATE 
---- ---------- 
BOB 24/05/2013 
BOB 12/06/2012 
BOB 19/10/2011 
BOB 05/02/2010 
BOB 05/01/2009 
CARL 15/05/2011 
LOUI 15/01/2014 
LOUI 15/05/2013 
LOUI 15/05/2012 

DATA newdata; 
    SET mydata; 
    count + 1; 
    IF FIRST.name THEN count=1; 
    BY name DESCENDING date; 
run; 

这里我得到了数组明智1,2,3等等。如果count> 3,我想输出名称(所有obob的bob)。请帮助我..通过编组创建新的数据SAS

回答

0

我认为这说明了SQL的强大功能 - 虽然有些人会说,因为这会在日志中生成一个NOTE,这不是一种好的做法。使用GROUP & HAVING子句中SQL创建名的计数,你再限制为3

proc sql; 
create table want as 
select * 
from have 
group by name 
having count(name)>3; 
quit; 
1

最简单的方法是输出每个ID的最后一行(如果它大于3),然后将该数据集合并回主数据集,只保留匹配。您也可以使用PROC FREQ生成计数数据集并合并到该数据集。

您可以使用DoW循环在一个datastep中完成它,但这更复杂,所以我不会推荐新用户这样做。

+0

谢谢..它使用合并..你可以给循环提示..谢谢 –

0

这里有几个不同的方法来做到这一点使用SUBQUERIES在PROC SQL

Data HAVE; 
    Length NAME $50; 
    Input Name $ Date: ddmmyy10.; 
    Format date ddmmyy10.; 
    datalines; 
BOB 24/05/2013 
BOB 12/06/2012 
BOB 19/10/2011 
BOB 05/02/2010 
BOB 05/01/2009 
CARL 15/05/2011 
LOUI 15/01/2014 
LOUI 15/05/2013 
LOUI 15/05/2012 
; 
Run; 

在Where语句

Proc sql; 
     Create table WANT1 as 
     Select * 
     From Have 
     Where Name in (Select name from have b group by b.name having count(b.name)>3); 
    Quit; 

在使用子查询子句

使用多值子查询
Proc sql; 
     Create table WANT2 as 
     Select a.name, a.date 
     From Have a Inner Join (select name, count(name) as Count from have b group by b.name having Count>3) 
      On a.name=b.name 
     ; 
    Quit;