2015-11-26 2 views
2

Я хочу добавить столбец auto_Increment в таблицу в SAS.Получить код add, а не увеличивать значение. Спасибо заранее.Я хочу добавить столбец auto_increment в таблице в SAS

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

Таблица W_cur_qtr_recoveries - это набор данных SAS, не так ли? (Другой возможностью является доступ к таблице RDBMS через неявный сквозной проход) – Quentin

ответ

1

Ничего себе, попробуем, чтобы мой второй «SAS не делает этого» ответ сегодня утром. Рискованные вещи.

Набор данных SAS не может определять столбец с автоматическим приращением. Независимо от того, создаете ли вы новый набор данных или вставляете записи в существующий набор данных, вы несете ответственность за создание любых счетчиков приращений (т. Е. Это просто обычные числовые вары, где вы задали значения так, как хотите).

Это говорит о наличии инструкций шага DATA, таких как суммарный оператор (например, MyCounter+1), который упрощает реализацию счетчиков. Если вы расскажете больше о своей проблеме, люди могут предоставить некоторые альтернативы.

0

В наборе данных SAS нет такой позиции, как столбец автоматического увеличения. Вы можете использовать шаг данных для создания нового набора данных с новой переменной. Вы можете использовать одно и то же имя, чтобы при необходимости заменить старый.

data pmt.W_cur_qtr_recoveries; 
    set pmt.W_cur_qtr_recoveries; 
    ID+1; 
run; 
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; 
1

Правильный ответ на это время, чтобы создать идентификатор себя, но обсуждение было бы неполным без упоминания, что есть неподдерживаемые функции SQL Monotonic, что может делать то, что вы хотите. Это ненадежно, но оно сохраняется. Узор кода для его использования является

select monotonic() as ID, .... 
+0

Стоит отметить, что в определенных ситуациях «monotonic()» будет делать некоторые явно странные вещи - например, если вы используете его в подзапросе, чей заказ не соответствует самому «порядку». – user667489

0

где «W_prv_qtr_recoveries» представляет собой таблицу Имя и «ПМТ» является именем библиотеки. Благодаря пользователю2337871.

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; 
+0

Смущенный этим ответом, это тот же код, что и @ user2337871, правильно? Вы хотели что-то добавить? Если вы намерены сказать, что этот код отвечает на ваш вопрос, я предлагаю вам принять этот ответ с пояснительными комментариями. – Quentin

Смежные вопросы