SAS Hive SQL (Hadoop) версия Proc Transpose? - PullRequest
0 голосов
/ 26 ноября 2018

Мне было интересно, есть ли версия «Proc Transpose» в SAS Hive SQL (Hadoop)?

В противном случае я вижу единственный другой (длинный) способ создания большого количества отдельных таблиц длязатем объединитесь, чего я бы предпочел избежать.

Любая помощь приветствуется!

Пример таблицы для транспонирования > Намерение поставить Месяц на вершину таблицытаким образом, ставки делятся по месяцам:

+------+-------+----------+----------+-------+
| YEAR | MONTH |   Geog   | Category | Rates |
+------+-------+----------+----------+-------+
| 2018 |     1 | National | X        |    32 |
| 2018 |     1 | National | Y        |    43 |
| 2018 |     1 | National | Z        |    47 |
| 2018 |     1 | Regional | X        |    52 |
| 2018 |     1 | Regional | Y        |    38 |
| 2018 |     1 | Regional | Z        |    65 |
| 2018 |     2 | National | X        |    63 |
| 2018 |     2 | National | Y        |    14 |
| 2018 |     2 | National | Z        |    34 |
| 2018 |     2 | Regional | X        |    90 |
| 2018 |     2 | Regional | Y        |    71 |
| 2018 |     2 | Regional | Z        |    69 |
+------+-------+----------+----------+-------+

Пример вывода:

+------+----------+----------+----+----+
| YEAR |   Geog   | Category | 1  | 2  |
+------+----------+----------+----+----+
| 2018 | National | X        | 32 | 63 |
| 2018 | National | Y        | 43 | 14 |
| 2018 | National | Z        | 47 | 34 |
| 2018 | Regional | X        | 52 | 90 |
| 2018 | Regional | Y        | 38 | 71 |
| 2018 | Regional | Z        | 65 | 69 |
+------+----------+----------+----+----+

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

, если ваш примерный набор данных представляет реальный набор данных, тогда вы можете использовать простое внутреннее соединение, как показано ниже.Год гео и категории делает уникальную комбинацию ниже код должен работать.

 select a.YEAR ,   
    a.Geog ,  
    a.Category , 
    a.Rates ,
    a.month as  month_1, 
    b.month as  month_2 
from have a
inner join
 have b
 on a.year = b.year
 and  a.Geog = b.Geog 
and  a.Category = b.category
where a.month ne b.month;
0 голосов
/ 26 ноября 2018

Типичным фоновым рисунком SQL-метода для транспонирования (или поворота) является преобразование группы + в операторы сводного регистра подзапрос в группе агрегирующем запросе, которыйсворачивает подзапрос.Группа представляет собой одну результирующую сводную строку.

Например, ваша группа year, geog, category и min используется для свертывания:

proc sql;
  create view want_pivot as
  select year, geog, category
  , min(rate_m1) as rate_m1
  , min(rate_m2) as rate_m2
  from
  ( select
    year, geog, category
    , case when month=1 then rates end as rate_m1
    , case when month=2 then rates end as rate_m2
    from have
  )
  group by year, geog, category
  ;

ЗдесьЭто та же самая концепция, немного более общая, когда данные повторяются внутри группы на уровне детализации, а mean используется для свертывания повторов.

data have;
input id name $ value;
datalines;
1 a 1
1 a 2 
1 a 3
1 b 2
1 c 3
2 a 2
2 d 4
2 b 5
3 e 1
run;

proc sql;
  create view have_pivot as 
  select
  id
  , mean(a) as a
  , mean(b) as b
  , mean(c) as c
  , mean(d) as d
  , mean(e) as e
  from
  (
    select
      id
      , case when name='a' then value end as a
      , case when name='b' then value end as b
      , case when name='c' then value end as c
      , case when name='d' then value end as d
      , case when name='e' then value end as e
    from have
  )
  group by id
;
quit;

Когда имена столбцов не известны априори, вам необходимо написать генератор кода, который передает все данные для определения значений имен, записывает запрос обоев, который выполнит второй проходданные, возвращающие стержень.

Кроме того, во многих современных базах данных есть предложение PIVOT, которое можно использовать с помощью сквозного прохода.

Сообщение Hadoop Mania "TRANSPOSE / PIVOT a Table inУлей " показывает использование collect_list и map в похожей обойной манере:

select b.id, b.code, concat_ws('',b.p) as p, concat_ws('',b.q) as q, concat_ws('',b.r) as r, concat_ws('',b.t) as t from
 (select id, code,
 collect_list(a.group_map['p']) as p,
 collect_list(a.group_map['q']) as q,
 collect_list(a.group_map['r']) as r,
 collect_list(a.group_map['t']) as t
 from ( select
  id, code,
  map(key,value) as group_map
  from test_sample
 ) a group by a.id, a.code) b;
...