我想在SAS的表中添加auto_increment列

时间:2015-11-26 11:32:45

标签: sas

我想在SAS中的表中添加auto_Increment列。以下代码添加一列但不增加值。 提前致谢。

proc sql;
alter table pmt.W_cur_qtr_recoveries
add ID integer;
quit;

7 个答案:

答案 0 :(得分:2)

哇,今天早上去尝试我的第二个“SAS不会这样做”。冒险的东西。

SAS数据集无法定义自动增量列。无论是创建新数据集还是将记录插入现有数据集,您都要负责创建任何增量计数器(即它们只是您将值设置为所需值的普通数字变量)。

也就是说,有一些DATA步骤语句,例如sum语句(例如MyCounter+1),可以更容易地实现计数器。如果您描述问题的更多细节,人们可以提供一些替代方案。

答案 1 :(得分:2)

此时的正确答案是自己创建ID,但如果没有提到有一个不支持的SQL函数Monotonic可以做你想要的事情,那么讨论就不会完整。它不可靠,但它仍然存在。 其用法的代码模式是

onComplete: function() {
    var path = require("path");
    var browserName, browserVersion;
    var reportPath = 'C:/QA/test_results/';
    var capsPromise = browser.getCapabilities();
    return capsPromise.then(function (caps) {
        browserName = caps.caps_.browserName.toLowerCase();
        browserName = browserName.replace(/ /g,"-");
        browserVersion = caps.caps_.version;
        return null;
    });

    var HTMLReport = require('jasmine-xml2html-converter');
        reportPath += browserName;

答案 2 :(得分:2)

在如下数据步骤中使用_N_自动变量:

DATA TEMPLIB.my_dataset (label="my dataset with auto increment variables");
SET TEMPREP.my_dataset;
sas_incr_num = _N_; * add an auto increment 'sas_incr_num' variable; 
sas_incr_cat = cat("AB.",cats(repeat("0",5-ceil(log10(sas_incr_num+1))),sas_incr_num),".YZ"); * auto increment the sas_incr_num variable and add 5 leading zeros and concatenate strings on either end; 

LABEL
sas_incr_num="auto number each row"
sas_incr_cat="auto number each row, leading zeros, and add strings along for fun"
...

答案 3 :(得分:0)

SAS数据集中没有自动增量列这样的东西。您可以使用数据步骤创建具有新变量的新数据集。完成后,您可以使用相同的名称替换旧名称。

 data pmt.W_cur_qtr_recoveries;
   set pmt.W_cur_qtr_recoveries;
   ID+1;
 run;

答案 4 :(得分:0)

这实际上取决于你的预期结果。但是我已经把你如何解决这个问题的例子拼凑在了一起。它有点粗糙,但给你一些工作。

/*JUST SETTING UP THE DAY ONE DATA WITH AN ID ATTACHED
  YOU WOULD MAKE THE FIRST RUN EXECUTE DIFFERENTLY TO SUBSEQUENT RUNS BY USING THE EXISTS FUNCTION AND MACRO LANGUAGE, 
  BUT I WILL LET YOU INVESTIGATE THIS FURTHER AS IT MAY BE IRRELEVANT.*/

DATA DAY1;
    SET SASHELP.CLASS;
    ID+1;
RUN;

/*ON DAY 2 WE ARE APPENDING ADDITIONAL RECORDS TO THE EXISTING DATASET*/
DATA DAY2;
    /*APPEND DATASETS*/
    SET DAY1 SASHELP.CLASS;

    /*HOLD VALUE IN PROGRAM DATA VECTOR (PDV) UNTIL EXPLICITLY CHANGED*/

    RETAIN _ID;

    /*ADD VARIABLE _ID AND POPULATE WITH ID.  IN DOING THIS THE LAST INSTANCE OF THE ID WILL BE HELD IN THE PDV FOR THE
      FIRST OF THE NEW RECORDS*/

    IF ID ~= . THEN _ID = ID;

    /*INCREMENT THE VALUE IN _ID BY 1 AND DO SO FOR EACH RECORD ADDED*/

    ELSE DO;
        _ID+1;
    END;

    /*DROP THE ORIGINAL ID;*/
    DROP ID;

    /*RENAME _ID TO ID*/
    RENAME _ID = ID;

RUN;

答案 5 :(得分:0)

其中" W_prv_qtr_recoveries"是一个表名和" pmt"是一个图书馆名称。 感谢user2337871。

DATA pmt.W_prv_qtr_recoveries;

    SET pmt.W_prv_qtr_recoveries;


    RETAIN _ID;


    IF ID ~= . THEN _ID = ID;


    ELSE DO;
        _ID+1;
    END;


    DROP ID;

    RENAME _ID = ID;

RUN;

答案 6 :(得分:0)

假定此自动增量列将用于插入的每个记录。 我们可以做到如下: 我们将首先检查数据集中的最新密钥

PROC SQL;
SELECT MAX(KEY) INTO :MK FROM MYDATA;
QUIT;

%put KeyOld=&MK;

然后我们增加此键

Data _NULL_;
call symput('KeyNew',&MK+1);
run;

%put KeyNew=&KeyNew;

在这里,我们保留要插入的新记录,并添加相应的键

Data TEMP1;
set TEMP;
Key=&KeyNew;
run;

最后,我们将新记录加载到数据集中

PROC APPEND BASE=MYDATA DATA=TEMP1 FORCE;
RUN;