[英]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.