循环穿过桌子以连接行



我有一个类似结构的表:

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

,但显然这是错误的。有人可以告诉我如何循环浏览第二列并加入它们吗?逻辑是什么?

知道group_concat是正确的方法。但是还没有能弄清楚。当我尝试时:

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

但是,它会出现一个错误,说用户定义的变换函数group_concat必须具有超过子句

您正在寻找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;

使用array_agg

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

我认为您需要Listagg或group_concat,因为您正在使用Vertica Upper是PostGrey解决方案

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

如前所述,在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

最新更新