Вы применяете «значение, вычисленное по группе» к первой строке в группе. Этот вид потока обработки данных может быть выполнен с помощью цикла DOW для вычислений по группе, за которым следует последовательный цикл по группе для применения и вывода. Отслеживание первых встречающихся отдельных значений в группе можно отслеживать различными способами, включая временный массив максимального размера, хеш динамического размера или конкатенацию с разделителями.
Пример с использованием конкатенации с разделителями:
findw
используется для проверки ранее объединенного значения (это отслеживание). Разделителями являются подчеркивание (_
), которое является вашим разделителем, и пробел (
) для конечных пробелов конкатенации
do
… until
- это DOWloop и do
… to _n_
- последовательный цикл. Обратите внимание, как вычисленное значение очищается после того, как оно было output
в первой строке каждой группы.
data have;
do id = 1 to 10;
do _n_ = 1 to 20 * ranuni(123);
length name $20;
if _n_ = 1
then name = 'Start';
else name = scan ('apple pear guava peach orange cherry lemon lime', ceil(8*ranuni(123)));
value = ceil(6*ranuni(123));
if id = 5 then
value = 1;
output;
end;
end;
run;
data want;
do _n_ = 1 by 1 until (last.id);
set have;
by id;
length group_computation $75;
if not findw (group_computation, strip(value), '_ ') then
group_computation = catx('_', group_computation, value);
end;
if index(group_computation, '_') = 0
then group_computation = 'no';
else group_computation = 'Yes, ' || group_computation;
do _n_ = 1 to _n_;
set have;
output;
if _n_ = 1 then group_computation = '';
end;
run;