Сравните последнюю строку с предыдущей строкой по группе и заполните новый столбец - PullRequest
0 голосов
/ 05 августа 2020

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

Также необходимо учитывать наличие группы только с одной строкой.

что у нас есть:

 Group    Name     Sport     DogName   Eligibility 
   1      Tom      BBALL     Toto        Yes
   1      Tom      BBall     Toto        Yes
   1      Tom      golf      spot        Yes
   2     Nancy     vllyball  Jimmy       yes
   2     Nancy     vllyball  rover       no
  

что мы хотим:

 Group    Name     Sport     DogName   Eligibility N_change  S_change  D_Change  E_change
     1      Tom      BBALL     Toto        Yes      0           0        0       0
     1      Tom      BBall     Toto        Yes      0           0        0       0
     1      Tom      golf      spot        Yes      0           1        1       0
     2     Nancy     vllyball  Jimmy       yes      0           0        0       0
     2     Nancy     vllyball  rover       no       0           0        1       1

Учитывать только изменения от строки к строке внутри группы. Заранее благодарим вас за любую помощь.

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

Я знал, что это будут массивы, и я борюсь с ними, потому что никогда не использую их для своего типичного sas-моделирования. Хотел, чтобы все было коротко и мило.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

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

Или вы можете поместить это в электронную таблицу, которая лучше обнаруживает изменения в столбцах, заполненных формулой = if (a2 <> a1,1,0). Только убедитесь, что никто не пересортировал данные электронной таблицы в новый порядок!

1 голос
/ 05 августа 2020

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

logi c ниже сравнивает каждую строку с предыдущей. Флаг 1 будет установлен, только если:

  1. Это не первая строка группы
  2. Текущее значение отличается от предыдущего значения.

Синтаксис var = (test logic); - это ярлык для автоматической генерации фиктивных флагов.

data want;
    set have;
    by group;

    array var[*]        name sport dogname eligibility;
    array lagvar[*] $   lag_name lag_sport lag_dogname lag_eligibility;
    array changeflag[*] N_change S_change D_change E_change;

    do i = 1 to dim(var);
        lagvar[i]     = lag(var[i]);
        changeflag[i] = (var[i] NE lagvar[i] AND NOT first.group);
    end;
  
   drop lag: i;
run;
...