通过分组SAS创建新数据集

时间:2015-04-12 18:35:18

标签: sas

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所以..我想要名字的输出(所有的bob)如果计数>请帮帮我..

3 个答案:

答案 0 :(得分:1)

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

您可以使用DoW循环在单个datastep中执行此操作,但这更复杂,因此我不建议新用户执行此操作。

答案 1 :(得分:0)

我认为这显示了SQL的强大功能 - 尽管有人会说,因为这会在日志中生成一个NOTE,这不是一个好习惯。使用GROUP& SQL中的HAVING子句创建一个名称的计数,然后将其限制为3.

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

答案 2 :(得分:0)

以下是使用PROC SQL

中的SUBQUERIES执行此操作的几种不同方法
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;

在From子句中使用子查询

    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;