как выбрать всего 3 obs на ветку?

#sql #sas #partition #proc

#sql #sas #раздел #proc

Вопрос:

Я хочу выбрать только 3 OBS на ветку, где мне нужно ответить на эти правила:

  1. если в ветке всего 2 аккаунта — принесите 2 самых высоких дохода с первого филиала и 1 со второго аккаунта
  2. если в ветке 3 аккаунта — приведите по 1 наблюдению на аккаунт, которые являются самыми высокими.
  3. если на ветку приходится 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 , а затем верхнюю строку where row_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;
 

Вывод

введите описание изображения здесь