#sql #sas #partition #proc
#sql #sas #раздел #proc
Вопрос:
Я хочу выбрать только 3 OBS на ветку, где мне нужно ответить на эти правила:
- если в ветке всего 2 аккаунта — принесите 2 самых высоких дохода с первого филиала и 1 со второго аккаунта
- если в ветке 3 аккаунта — приведите по 1 наблюдению на аккаунт, которые являются самыми высокими.
- если на ветку приходится 4 или более учетных записей — приведите по 1 наблюдению на учетную запись, , которые являются самыми высокими — не повторяя одну и ту же учетную запись дважды
Комментарии:
1. Отредактируйте свой вопрос и покажите нужные результаты. Как вы определяете «первую» учетную запись и «вторую» учетную запись. В отличие от наборов данных SAS, таблицы SQL представляют собой неупорядоченные наборы.
Ответ №1:
Хммм . row_id
, , Столбец, похоже, упорядочивает доходы внутри учетной записи. Итак, вы должны уметь использовать proc sql
, хотя это немного запутанно:
select t.*
from t join
(select crm_branch_id, count(distinct account_id) as cnt
from t
group by crm_branch_id
) b
on b.crm_branch_id = t.crm_branch_id
where (cnt = 1 and t.row_id <= 3) or
(cnt = 2 and t.row_id = 1 or
cnt = 2 and t.row_id = 2 and
t.income = (select max(t2.income)
from t t2
where t2.crm_branch_id = t.crm_branch_id and
t2.row_id = 2
)
) or
(cnt = 3 and row_id = 1) or
(cnt > 3 and row_id = 1 and
(select count(*)
from t t2
where t2.crm_branch_id = t.crm_branch_id and
t2.row_id = 1 and
t2.income >= t.income
) <= 3
);
Тайная логика в where
предложении заключается в обработке разного количества учетных записей:
- Если есть одна учетная запись, возьмите три верхние строки.
- Если есть две учетные записи, возьмите две строки с
row_id = 1
, а затем верхнюю строку whererow_id = 2
. - Если есть три учетные записи, возьмите строки с.
row_id = 1
- Если есть четыре или более учетных записей, учитывайте только строки, где
row_id = 1
. Затем возьмите три лучших из них, основанных на доходе.
Ответ №2:
Обработка DOW может выполнять выбор цвета.
- Первый цикл, подсчитайте количество
account
s вbranch
- Второй цикл, вывод top
income
s в соответствии с правилами- Требуется, чтобы данные были предварительно упорядочены следующим образом
- непрерывный в
branch
иaccount
- по убыванию
income
- по возрастанию
seq_act
- непрерывный в
- Требуется, чтобы данные были предварительно упорядочены следующим образом
Пример:
data have;
input income account_id branch_id seq_act;
datalines;
1224932 123 358 1
700400 123 358 2
646730 123 358 3
644677 123 358 4
2017 123 358 5
11338320 567 358 1
3806060 567 358 2
3642089 567 358 3
1403174 567 358 4
400530 567 358 5
;
/* presume data is
* - contiguous by branch and account
* - descending income
* - ascending seq_act
*/
data want(drop=i n);
* count number of accounts in branch;
do until (last.branch_id);
set have;
by branch_id account_id notsorted descending income /*ascending*/ seq_act;
n first.account_id;
end;
do until (last.branch_id);
set have;
by branch_id account_id notsorted;
i first.account_id;
select (n);
when (1) if seq_act <= 3 then output; /* first 3 when 1 account */
when (2) if seq_act <= 3-i then output; /* first 2 then first 1 when 2 accounts */
otherwise if seq_act = 1 then output; /* first 1 from each account */
end;
end;
i = 0;
n = 0;
run;
Вывод