循环以从数据集一次读取固定记录数量的记录,直到读取所有记录

时间:2015-04-24 09:55:07

标签: sql sas sas-macro proc-sql

我在一家公司的销售部门工作,每个月我们都有一些销售收入为负的产品。我的工作是提取那些产品ID来分析它们。我使用的是使用SAS语言的WPS。因此,我首先需要使用proc sql提取产品ID(例如,在96年2月的产品中)。 在第二步中,我在proc sql中使用这些ID来获取有关这些产品的额外信息,如价格,日期等......

问题在于,在WPS中,有一个限制是3000次观察,而不是在proc sql语句中读取。 所以我需要做一个循环,计算一个月内ID的数量,然后提取它附加的3000个第一个ID的信息,并附加以下ID,并一次又一次地追加,直到我得到所有9680个ID,并带有额外信息

我的代码是:

PROC SQL;  
    CREATE TABLE Febsales.NB_IDs AS 
    SELECT /* COUNT of Number of products  */
        (COUNT(t1.ID)) AS NB_ID
FROM ID_prod t1
WHERE t1.ID_sales_revenue < 0;
QUIT;

其余的我不知道该怎么做。

我的想法是告诉sas:

do i=1 to='&NB_ID' by=3000

然后使用以下代码进行提取:

%TeradataOpen (Lib=  Revenue AF Socle ODS,dataout=af0215_liste1)
SELECT
    OD_prod.pd_ID,
    OD_prod.pd_line ,
    OD_prod.pd_serie ,
    OD_prod.pd_manu,
    OD_prod.pd_cust_ID,
    OD_prod.pd_price,
    OD_prod.pd_amount,
    OD_prod.pd_cost,
    OD_prod.pd_buyer,
    OD_prod.pd_mkt_share,
    OD_prod.pd_gross,
    OD_prod.pd_marketor,
    sum(OD_prod.pd_mkt_share) as tot_share,
    sum(OD_prod.pd_GROss) as tot_rev,
    OD_prod.DAT_prod as prod,
FROM
    OD_prod,
    OD_ manufact
WHERE .....

然后是:

proc append

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容

  • Num是源数据集中的观察总数,您在第一步中执行此操作
  • Chunk是您想要一次读取的观察次数,3000 在你的情况下。

下面的代码片段执行以下操作:

  • 正在生成每个循环中要读取的starting(如1,3001,6001等)和ending(3000,6000,9000等)记录位置
  • 计算读取所有记录所需的循环次数
  • 在宏变量中阅读以上三个
 %let num=10000;
    %let chunk=3000;

    data _NULL_;
    length startp $200. endp $200.;
    Numofloop=int(&num./&chunk.);

    if _N_=1 then do; startp=1; endp=&chunk.; end;

    do i=1 to Numofloop-1;
    sp=i*&chunk + 1;
    ep=(i+1)*&chunk.;

    if i=Numofloop-1 then ep=&num.;

    startp=catx(",",startp,sp);
    endp=catx(",",endp,ep);

    put _ALL_;
    output;
    call symput("startp",startp);
    call symput("endp",endp);
    call symput("loop",Numofloop);
    end;

    run;

在使用loopstarting以及ending positions的此步骤中,temp数据集中的每一步都会读取3000条记录,并且正在{ {1}}数据集。

alldata

这可能不是您问题的确切解决方案,但当然您可以使用此

构建代码

答案 1 :(得分:0)

  1. 创建ID列表
  2. 将它们拆分为3000个ID组
  3. 构建SQL视图以获取每个组的补充数据
  4. 将所有视图连接在一起
  5. %LET LIMIT = 3000 ;
    /* Get list of IDs */
    proc sql ;
      create table idlist as
      select distinct ID
      from id_prod
      where ID_SALES_REVENUE < 0
      order by ID ;
    quit ;
    
    /* Assign GROUP number to each set of &LIMIT ID's */
    data idlist2 ;
      set idlist ;
      N = _n_ ;
      GROUP = floor(N / &LIMIT) + 1;
    run ;
    
    /* Get number of groups */
    proc sql ;
      select max(GROUP) into :GRP_CNT from idlist2 ;
    quit ;
    
    %MACRO BUILD_VIEWS ;
      /* Build view1-view<n> for each group of &LIMIT ID's */
      proc sql ;
        %DO G = 1 %TO &GRP_CNT ;
    
        create view pd_view&G as
        select ...
        from od_prod, od_manufact
        where ...
          and pd_id in(select ID from idlist2 where GROUP = &G) ;
    
        %END ;
      quit ;
    %MEND ;
    %BUILD_VIEWS ;
    
    /* Now read from each view into 1 dataset */
    data master ;
      set pd_view1-pd_view&GRP_CNT ;
    run ;