2013-04-11 40 views
1

假设我有一个表cities,其字段为statecity。数据是这样的:作为一个join()聚合函数,可以在特定的字符上共同赋值字段值吗?

State  City 
Ohio  Eaton 
Ohio  Columbus 
Ohio  Dayton 
Ohio  Greenville 
New York New York 
New York Albany 
New York Syracuse 

我希望能够做到这一点:

select state, join(city,',') from cities 
group by state 

...回到这一点:

State  City 
Ohio  Eaton,Columbus,Dayton,Greenville 
New York New York,Albany,Syracuse 

我需要创建一些疯狂UDF为此?如果没有函数,是否有办法使用一些SQL魔法来实现这一点?

+1

所以基本上相当于mysql的group_concat()函数?发现这个:http://forums.teradata.com/forum/analytics/concatenate-vertically – 2013-04-11 18:28:53

回答

2

递归CTE应该能够做到这一点。我嘲笑每个国家的序列号重置。你可能不得不根据你的实际表格来调整它,但至少应该让你朝着正确的方向思考。 (类似于马克B在Teradata论坛上链接的内容,但希望这可以更容易阅读)。

WITH RECURSIVE city_list (state, cities, seq) AS 
(
    SELECT s.state 
     , s.city 
     , ROW_NUMBER() OVER (PARTITION BY State ORDER BY State, City) AS seq 
    FROM states s 
    QUALIFY seq = 1 
    UNION ALL 
    SELECT c.cities ||’, ’|| s.city 
     , ROW_NUMBER() OVER (ORDER BY State, City) AS seq 
    FROM city_list c, states s 
    WHERE s.seq = c.seq + 1 
    AND s.state = c.state 
) 
SELECT r.state, r.cities 
FROM city_list r 
WHERE r.seq = (SELECT MAX(h.seq) FROM city_list h 
       WHERE h.state = r.state 
       GROUP BY h.state) 
; 
相关问题