Вы не указали, хотите ли вы (а) все исходные записи, чья совокупность частот удовлетворяет вашему условию, или (б) только уникальные пары (категория, значение), для которых выполняется условие.
Если вы хотите (а), решение SQL, уже предложенное Kiran, является хорошим и является самым кратким решением, которое я могу придумать.Однако, если вы хотите сделать это на шаге DATA, это также может быть сделано.Во-первых, давайте предположим, что ваши данные отсортированы по (категории, значению), как кажется.Затем вы можете закодировать так называемый двойной цикл DoW:
data want (drop = _:) ;
do _n_ = 1 by 1 until (last.value) ;
set have ;
by category value ;
_fsum = sum (_fsum, frequency) ;
end ;
do _n_ = 1 to _n_ ;
set have ;
if _fsum > 10 then output ;
end ;
run ;
Если ваши данные не отсортированы, для достижения эффекта можно использовать хеш-таблицу:
data want (drop = _:) ;
dcl hash h (ordered:"a") ;
h.definekey ("category", "value") ;
h.definedata ("_fsum") ;
h.definedone () ;
do until (last) ;
set have end = last ;
if h.find() ne 0 then _fsum = frequency ;
else _fsum + frequency ;
h.replace() ;
end ;
do until (0) ;
set have ;
h.find() ;
if _fsum > 10 then output ;
end ;
run ;
ЕслиВы хотите (б), т.е. только отдельные пары (категория, значение), SQL (в предложенной форме) не будет работать.Шаг DATA будет выполнен, если вы уменьшите код для решения для отсортированных входных данных до следующего:
data want (keep = category value) ;
do until (last.value) ;
set have ;
by category value ;
_fsum = sum (_fsum, frequency) ;
end ;
if _fsum > 10 ;
run ;
И для несортированных данных (подход хэширования):
data _null_ ;
dcl hash h (ordered:"a") ;
h.definekey ("category", "value") ;
h.definedata ("category", "value", "_fsum") ;
h.definedone () ;
do until (last) ;
set have end = last ;
if h.find() ne 0 then _fsum = frequency ;
else _fsum + frequency ;
h.replace() ;
end ;
h.output (dataset:"want (where = (_fsum > 10))") ;
stop ;
run ;
С уважением,
Пол Дорфман