Как уже говорилось, нет функции LISTAGG()
, а также нет встроенной функции для создания пользовательской функции агрегирования. Тем не менее, есть две возможности, которые получают вывод.
Пример один
Шаг данных с обработкой DOW и хэшированием для отслеживания различных значений флага при конкатенации в группе.
data want;
if 0 then set have; *prep pdv;
length flags $200;
declare hash _flags();
_flags.defineKey('flag');
_flags.defineDone();
do until (last.f2);
set have;
by f1 f2;
m1_sum = sum(m1_sum,m1);
m2_sum = sum(m2_sum,m2);
if _flags.find() ne 0 then do;
_flags.add();
flags = catx(',',flags,flag);
end;
end;
drop m1 m2 flag;
_flags.delete();
run;
Пример два
Создать пользовательскую функцию FCMP, используемую в SQL. Поскольку FCMP не может создать статистическую функцию, результат будет автоматически сопоставлен с исходными данными, которые затем должны быть отфильтрованы. Функция FCMP также использует хэш для отслеживания различных значений flag
в группе.
proc fcmp outlib=sasuser.functionsx.package;
function listagg(f1 $, f2 $, n, item $) $;
length result $32000 index 8;
static flag;
static index;
declare hash items();
if flag = . then do;
flag = 1;
rc = items.defineKey('item');
rc = items.defineDone();
end;
static items;
index + 1;
rc = items.replace();
if index = n then do;
declare hiter hi('items');
result = '';
do while (hi.next() = 0);
result = catx(',',result,item);
end;
index = 0;
rc = items.clear();
return (result);
end;
else
return ("");
endsub;
run;
options cmplib=sasuser.functionsx;
proc sql;
create table wanted as
select * from
(
select /* subselect is a remerge due to 'listagg' mimic */
f1,
f2,
listagg(f1, f2, count(*), flag) as flags,
sum(m1) as m1,
sum(m2) as m2
from have
group by f1, f2
)
where flags is not null /* filter the subselect */
;
quit;
В идеале хэш хэшей использовался бы, но FCMP обеспечивает создание экземпляра хеша только в операторе declare
, и динамические хэши не могут быть созданы с помощью _new_
. Пользователи SAS Viya смогут использовать новый компонентный объект Dictionary
в функции FCMP и могут иметь словарь словарей для отслеживания различных значений флагов в каждой группе.