Цикл по таблице для объединения строк - PullRequest
0 голосов
/ 01 июля 2019

У меня есть таблица аналогичной структуры:

Name Movies_Watched
A    Terminator
B    Alien
A    Batman
B    Rambo
B    Die Hard

....

Я пытаюсь получить это:

Name  Movies_Watched
A     Terminator;Batman
B     Alien, Die Hard, Rambo

Мое первоначальное предположение было:

SELECT Name, Movies_Watched || Movies_Watched from TABLE

Но очевидно, что это неправильно. Может кто-нибудь сказать мне, как я могу пройти через 2-й столбец и объединить их? Как выглядит логика?

Должен знать, что group_concat - правильный подход. Но пока не смог разобраться. Когда я попробовал:

select name, group_concat(movies_watched) from table group by 1

Но выдает ошибку, сообщающую Определяемая пользователем функция преобразования group_concat должна иметь предложение over

Ответы [ 3 ]

1 голос
/ 01 июля 2019

использовать array_agg

SELECT Name, array_agg(Movies_Watched)
FROM data_table
GROUP BY Name

я думаю, что вам нужен listagg или group_concat, так как вы используете vertica верхнее постгрейное решение

SELECT Name, listagg(Movies_Watched) 
FROM data_table
GROUP BY Name

или

 select Name, 
 group_concat(Movies_Watched) over (partition by Name order by name) ag
 from mytable
1 голос
/ 01 июля 2019

Вы ищете string_agg():

select name, string_agg(movie_watched, ';') as movies_watched
from t
group by name;

Тем не менее, вы используете Postgres, поэтому вы должны научиться использовать массивы вместо строк для таких вещей. Например, нет никакой путаницы с массивами, когда название фильма имеет точку с запятой. Это было бы:

select name, array_agg(movie_watched) as movies_watched
from t
group by name;
0 голосов
/ 02 июля 2019

Как уже упоминалось, в Vertica это LISTAGG ():

WITH
input(nm,movies_watched) AS (
          SELECT 'A','Terminator'
UNION ALL SELECT 'B','Alien'
UNION ALL SELECT 'A','Batman'
UNION ALL SELECT 'B','Rambo'
UNION ALL SELECT 'B','Die Hard'
)
SELECT
  nm AS "Name"
, LISTAGG(movies_watched) AS movies_watched
FROM input
GROUP BY nm;
-- out  Name |    movies_watched    
-- out ------+----------------------
-- out  A    | Terminator,Batman
-- out  B    | Alien,Rambo,Die Hard
-- out (2 rows)
-- out 
-- out Time: First fetch (2 rows): 12.735 ms. All rows formatted: 12.776 ms
...