【问题标题】:Create Index (ID) and increment (SAS)创建索引 (ID) 和增量 (SAS)
【发布时间】:2020-06-18 10:11:44
【问题描述】:

我有一个非常简单的销售信息表。

姓名 |价值 |索引
瑞声 | 1000 | 1
比特币 | 500 | 2
GRS | 250 | 3
瑞声 | 100 | 4

我添加了一个新的列名称索引。 我第一次跑

DATA BSP;
Index = _N_;
SET BSP;
RUN;

这是第一次正常工作。 但是现在我添加了越来越多的销售项目,并且新行应该得到一个新的索引号。最高指数 + 1 .... 旧销售额应保留 indexnumber。但是,如果我在所有新行下面运行代码,则索引 = 1。代码有什么问题。

proc sql noprint;
  select max(Index) into :max_ID from WORK.BSP;
quit;

DATA work.BSP;
    SET work.BSP;
  RETAIN new_Id &max_ID;    
  IF Index = . THEN DO;
        new_ID + 1;
        index = new_id;
END;
RUN;

【问题讨论】:

  • 您如何添加新的销售项目?追加? SQL 插入?设置?
  • SQL INSERT 从另一个表

标签: sas increment


【解决方案1】:

您在第一步中定义了索引列的值。您要设置的新数据在哪里?这段代码就像你的数据一样运行良好。你能分享你的基础数据集和你想要更改的最后一个数据集吗?也许你的数据是错误的? (顺便说一句,索引变量名不是一个幸运的选择:-))

data BSP;
    Name="AAC";Value=1000;Index=1;output;
    Name="BTR";Value=500;Index=2;output;
    Name="GRS";Value=250;Index=3;output;
    Name="AAC";Value=100;Index=4;output;
run;
/* the row where Index not definied */
data BSPNew;
    Name="XXX";Value=1000;output;
run;

proc sql noprint;
  select max(Index) into :max_ID from WORK.BSP;
quit;
%put &max_Id.;

proc append base=BSP data=BSPNew force;
run;

DATA work.BSP;
 SET work.BSP;
    RETAIN new_Id &max_ID;    
    IF Index = . THEN DO;
        new_ID + 1;
        index = new_id;
    END;
RUN;

data _null_;
    set BSP;
    put Name Value Index;
run ;

/* the result is:
AAC 1000 1
BTR 500 2
GRS 250 3
AAC 100 4
XXX 1000 5
*/

【讨论】:

  • 如果我第一次运行代码,它运行良好,但如果我添加更多行,则索引为 1。我再添加两行并使用数据 BSPNew 运行代码
  • 你能告诉我你是如何添加新行的吗?
【解决方案2】:

您需要展示更多可以证明问题的代码。以下示例与您的示例相同,但不会“失败”分配所需的 index

例子:

data master;
  do name = 'A','B','C';  OUTPUT;  end;
run;

data master;
  set master;
  index = _n_;
run;

data new;
  do name = 'E','F','G';  OUTPUT;  end;
run;

proc sql noprint;
  insert into master(name) select name from new;  * append new rows;
  select max(index) into :next_index from master; * compute highest index known;

data master;
  set master;
  retain next_index &next_index;  * utilize highest index;
  if index = . then do;
    next_index + 1;               * increment highest index before applying;
    index = next_index;
  end;
  drop next_index;                * discard 'worker' variable;
run;

如果插入语句看起来像这样,您可能不小心插入了1

insert into master select name, 1 from new;

或者新数据的索引已经设置为'1'

insert into master select name, index from new;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2016-08-27
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多