Как выполнить конкатенацию строк в улье - PullRequest
0 голосов
/ 13 июля 2020

У меня есть 2 таблицы, скажем, таблица 1 следующим образом

enter image description here

and table 2 as follows

enter image description here

and the result i expected is

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

Я пробовал использовать метод concat_ws в улье, но результаты не соответствуют ожидаемым, и, более того, когда я использую метод concat_ws, я могу подать заявку только на 1 поле. Пожалуйста, дайте мне знать, как преодолеть или есть ли какое-либо решение.

1 Ответ

2 голосов
/ 13 июля 2020

Используйте collect_set, чтобы получить массив частей на (name, function), затем используйте concat_ws, чтобы объединить массив с использованием запятой в качестве разделителя:

select t.name1, t1.function, t2.parts, t2.body, t1.scope
from
(select name1, function,
        concat_ws(',',collect_set(scope)) as scope
   from table1
  group by name1, function
) t1
 inner join
(select name2, function,
        concat_ws(',',collect_set(parts)) as parts,
        concat_ws(',',collect_set(Body)) as Body
   from table2 t2 
  group by name2, function
)t2
 on t1.name1=t2.name2 and t1.function=t2.function 

Еще один подход - без объединения, используя UNION ALL + агрегация, это может быть более производительным:

select name, function,
       concat_ws(',',collect_set(parts)) as parts,
       concat_ws(',',collect_set(Body)) as Body,
       concat_ws(',',collect_set(scope)) as scope
from
(
select name1 as name, function, null as parts, null as Body, scope from table1
UNION ALL
select name2 as name, function, parts, Body, null as scope from table2
)s
group by name, function
...