如何在PieCloudDB中替代group_concat实现按国家取前三城市需求
问题描述
现有一张记录城市旅游影响力得分的Cities表,结构及数据如下:
| id | country | points | city |
|---|---|---|---|
| 102 | UAE | 93 | Dubai |
| 128 | France | 99 | Paris |
| 133 | Spain | 90 | Barcelona |
| 149 | Germany | 80 | Munich |
| 222 | Germany | 88 | Berlin |
| 241 | Spain | 94 | Madrid |
| 777 | Germany | 80 | Heidelberg |
| 900 | Germany | 80 | Hamburg |
需求:按国家找出总分排名前三的城市,若多个城市总分相同则按城市名称升序排列;若无第二城市则输出No Second City,若无第三城市则输出No Third City。
原MySQL查询语句在PieCloudDB中执行报错function group_concat(text) does not exist,原因是PieCloudDB兼容PostgreSQL生态,不支持MySQL专属的group_concat函数,需用等价函数替代实现需求。
解决方案
PieCloudDB中可用string_agg函数替代group_concat,其余逻辑保持原语句的业务规则,修改后的查询语句如下:
WITH a AS ( SELECT country, concat(city,' (',sum(points),')') AS city, row_number() over(partition by country order by sum(points) desc, city) AS rn FROM Cities GROUP BY country, city ) SELECT country, string_agg(CASE WHEN rn = 1 THEN city ELSE NULL END, '') AS top_city, coalesce(string_agg(CASE WHEN rn = 2 THEN city ELSE NULL END, ''), 'No Second City') AS second_city, coalesce(string_agg(CASE WHEN rn = 3 THEN city ELSE NULL END, ''), 'No Third City') AS third_city FROM a WHERE rn <= 3 GROUP BY country ORDER BY country;
关键说明
string_agg是PostgreSQL生态中用于字符串聚合的函数,作用和MySQL的group_concat完全一致,语法为string_agg(待聚合表达式, 分隔符)。这里每个排名只会对应一个城市,因此分隔符使用空字符串即可。- 其余逻辑与原MySQL语句完全匹配:先通过CTE计算每个城市的总分并按规则排名,再通过条件聚合提取前三的城市,用
coalesce处理空值,替换为指定的提示文本。
执行该语句后可得到预期结果:
| country | top_city | second_city | third_city |
|---|---|---|---|
| France | Paris(99) | No Second City | No Second City |
| Germany | Berlin(88) | Hamburg(80) | Heidelberg(80) |
| Spain | Madrid(94) | Barcelona(90) | No Third City |
| UAE | Dubai(93) | No Second City | No Second City |
内容的提问来源于stack exchange,提问作者heihei Li
相关产品推荐
相关产品推荐

