簡體   English   中英

遍歷表以連接行

[英]Loop Through a Table to concatenate Rows

我有一個類似結構的表:

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子句

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

我認為您在使用vertica upper時需要listagg或group_concat是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM