You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PieCloudDB中替代group_concat实现按国家取前三城市需求

问题描述

现有一张记录城市旅游影响力得分的Cities表,结构及数据如下:

idcountrypointscity
102UAE93Dubai
128France99Paris
133Spain90Barcelona
149Germany80Munich
222Germany88Berlin
241Spain94Madrid
777Germany80Heidelberg
900Germany80Hamburg

需求:按国家找出总分排名前三的城市,若多个城市总分相同则按城市名称升序排列;若无第二城市则输出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处理空值,替换为指定的提示文本。

执行该语句后可得到预期结果:

countrytop_citysecond_citythird_city
FranceParis(99)No Second CityNo Second City
GermanyBerlin(88)Hamburg(80)Heidelberg(80)
SpainMadrid(94)Barcelona(90)No Third City
UAEDubai(93)No Second CityNo Second City

内容的提问来源于stack exchange,提问作者heihei Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:43:24