Объедините несколько переменных в разные группы в одном запросе Proc SQL - PullRequest
1 голос
/ 18 октября 2019

Мне нужно собрать около десяти различных переменных в разных группировках с помощью Proc SQL;Есть ли способ достичь SUM () OVER ([partition_by_clause] order_by_clause) в одном SQL-запросе с другим разделом по предложениям.

Я сделал пример здесь

data have;
infile cards;
input a b c d e f;
cards;
1 2 3 4 5
2 2 4 5 6
1 4 3 4 7
3 4 4 5 8
;
run;
proc sql;
create table want as
select *,
sum a over partiton by (b,c) as a1,
sum b over partiton by (c,d) as b1
sum c over partiton by (d,e) as c1
sum d over partiton by (a,c) as d1
from have
;
quit;

Я надеваюне хочу писать несколько SQL-запросов, группировать их по разным переменным и вычислять одну переменную на каждом шаге.

Надеюсь, это имеет смысл.

1 Ответ

0 голосов
/ 18 октября 2019

Proc SQL не реализует оконные функции и, следовательно, синтаксис разбиения в них, как в других реализациях SQL. Вы можете выполнить partition by только с проходным SQL-соединением, которое разрешает такой синтаксис.

Вы можете выполнить такое вычисление в шаге DATA, используя хэши.

data have;
infile cards;
input a b c d e ;
cards;
1 2 3 4 5
2 2 4 5 6
1 4 3 4 7
3 4 4 5 8
;
run;

data want;
  if 0 then set have;

  length a1 b1 c1 d1 8;

  declare hash a1s();
  a1s.defineKey('b', 'c');
  a1s.defineData('a1');
  a1s.defineDone();

  declare hash b1s();
  b1s.defineKey('c', 'd');
  b1s.defineData('b1');
  b1s.defineDone();

  declare hash c1s();
  c1s.defineKey('d', 'e');
  c1s.defineData('c1');
  c1s.defineDone();

  declare hash d1s();
  d1s.defineKey('a', 'c');
  d1s.defineData('d1');
  d1s.defineDone();

  do while (not end);
    set have end=end;
    if a1s.find() = 0 then a1+a; else a1=a;  a1s.replace();
    if b1s.find() = 0 then b1+b; else b1=b;  b1s.replace();
    if c1s.find() = 0 then c1+c; else c1=c;  c1s.replace();
    if d1s.find() = 0 then d1+d; else d1=d;  d1s.replace();
  end;

  do while (not last);
    set have end=last;
    a1s.find();
    b1s.find();
    c1s.find();
    d1s.find();
    output;
  end;

  format _numeric_ 4.;

  stop;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...