【问题标题】:Loop Through a Table to concatenate Rows循环遍历表以连接行
【发布时间】:2019-07-01 19:38:34
【问题描述】:

我有一个类似结构的表:

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必须有一个over子句

【问题讨论】:

标签: sql vertica string-aggregation


【解决方案1】:

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

【讨论】:

  • 感谢您的意见。但我收到此错误:[VERTICA][JDBC](3457) 错误:函数 array_agg(varchar)) 不存在或权限被拒绝
  • @fthedevs:如果您使用的是 Vertica,那么为什么要添加 postgresql 标签?
  • 对不起,那是个错误。
【解决方案2】:

使用 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

【讨论】:

  • string_agg() 是更好的选择。
  • 感谢您的意见。但我收到此错误:[VERTICA][JDBC](3457) 错误:函数 array_agg(varchar)) 不存在或权限被拒绝
  • @fthedevs in vertica 我认为 group_concat 是需要的
  • 我试过:seelct name,group_concat(movies_Watched) from table group by 1 但它显示用户定义的转换函数 group_concat 必须有一个 over 子句的错误
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多