Proc sql - группировка по агрегатной функции из подзапроса в основном запросе

Я два набора данных, содержащих миллионы строк. Таблица1 содержит два разных идентификационных номера, ID1 и ID2. Он также содержит переменную, объясняющую, к какой группе (переменная y1) принадлежит определенный идентификатор.

Вторая таблица (Таблица2) содержит две переменные из первой таблицы и дополнительную.

Я хочу объединить две таблицы вместе, но перед объединением я хочу, чтобы table1 содержал только информацию, сгруппированную по ID1, а также чтобы она давала мне информацию, к какой группе принадлежит идентификатор.

Я мог бы сделать это в два этапа Proc Sql, где я сначала создаю таблицу на table1, где я группирую по ID1, а затем создаю еще один шаг, где я объединяю ее с table2. Однако это довольно неэффективно, так как мои таблицы содержат так много строк, и поэтому я хотел бы сделать это за один прогон. Поэтому вместо этого я создал подзапрос, который делает то, что я хочу. Моя проблема в том, что я получаю ошибку, которую не могу сгруппировать по переменной "WhichGroup" из моего подзапроса, так как она происходит из агрегатной функции. Мне интересно, есть ли хороший обходной путь к тому, чего я хочу достичь?

Спасибо заранее!

Пример кода:

data table1;
input ID1 $ ID2 $ x1 2. y1 $;
datalines;
1 p1 10 Group1
1 p2 20 Group2
2 p3 50 Group1
;
run;

data table2;
input ID1 $ x1 x2;
datalines;
1 10 500
1 20 600
2 50 700
;
run;


Proc sql;
    Create table Test
      as select
        t1.WhichGroup
        ,sum(t1.Sum_x1) as Sum_x1
        ,sum(t2.x2) as Sum_x2
          from (select 
                    a.ID1
                    ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2'
                          when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1'
                          else 'Both' end as WhichGroup
                    ,Sum(a.x1) as Sum_x1
                  from work.table1  as a
                 group by 1
                ) as t1
            left join 
               work.table2   as t2
        on t1.ID1 = t2.ID1
    Group by 1;
Quit;

1 ответ

- Отвечая на мой собственный вопрос -

Я не уверен, почему это происходит, но я столкнулся с очень интересным явлением и потенциальной ошибкой в ​​SAS.

Похоже, что вся причина в том, что запрос не работает, состоит в том, что SAS не понимает оператор group by, если он задан цифрами, а не явно указывает имя переменной, по которой вы хотите сгруппировать. Потенциально SAS теряется в порядке столбцов?

Кто-нибудь еще сталкивался с таким явлением раньше в SAS?

Следовательно, запрос работает, если используется следующий код:

Proc sql;
    Create table Test
      as select
        t1.WhichGroup
        ,sum(t1.Sum_x1) as sum_x1
        ,sum(t2.x2) as Sum_x2
          from (select 
                    a.ID1
                    ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2'
                          when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1'
                          else 'Both' end as WhichGroup
                    ,Sum(a.x1) as Sum_x1
                  from work.table1  as a
                 group by 1
                ) as t1
            left join 
               work.table2   as t2
        on t1.ID1 = t2.ID1
    Group by WhichGroup;
Quit;
Другие вопросы по тегам