Создать индекс (ID) и приращение (SAS) - PullRequest
0 голосов
/ 18 июня 2020

У меня очень простая таблица с информацией о распродажах.

Имя | Значение | Индекс
AA C | 1000 | 1
БТР | 500 | 2
GRS | 250 | 3
AA C | 100 | 4

Я добавляю новый столбец Name Index. И я запускаю в первый раз

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

Впервые работает нормально. Но теперь я добавляю все больше и больше товаров для продажи, и новая строка должна получить новый индексный номер. Наивысший индекс + 1 .... Старые продажи должны сохранить индексный номер. Но если я запустил код ниже, все новые строки получат index = 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;

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Вам нужно показать больше вашего кода, который продемонстрирует проблему. Следующий пример такой же, как ваш, но не «сбой» для назначения желаемого 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;
0 голосов
/ 18 июня 2020

Вы определили значение столбца Index на первом шаге. Где новые данные, которые вы хотите установить? Этот код, как и ваши данные, работает хорошо. Можете ли вы поделиться своим базовым набором данных и последним набором данных, который вы хотите изменить? Может ваши данные неверны? (Кстати, имя переменной индекса не удачный выбор: -))

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
*/
...