如何在SQL(Google BigQuery)中按分区拼接字符串?
解决SQL/BigQuery中按UID分组拼接路径的问题
嘿,我来帮你搞定这个分组拼接的需求!你之前的语句没法正常运行,主要有两个问题:一是concat()不能搭配窗口函数这么用,二是partition by date, uid会把同一个UID的记录按日期拆分开,根本没法得到连续的路径。
其实BigQuery(以及很多现代SQL数据库)都有专门的字符串聚合函数,完全不用暴力写一堆条件语句,非常简便。
正确的BigQuery实现语句
SELECT uid, STRING_AGG(grouping, '-' ORDER BY date) AS path FROM temp1 GROUP BY uid
为什么这个写法能满足需求?
STRING_AGG是BigQuery内置的字符串聚合函数,专门用来把分组内的字符串按指定规则拼接起来。- 第一个参数
grouping是你要拼接的字段;第二个参数'-'是拼接时用的分隔符;ORDER BY date是关键——它保证了拼接的顺序严格按照日期从早到晚排列,正好符合你想要的路径顺序。 - 最后
GROUP BY uid确保我们是按每个UID单独分组拼接,不会把不同UID的记录混在一起。
验证结果
运行这个语句后,你会得到完全符合期望的输出:
uid, path 1, "a-a-b" 2, "x-x" 3, "z-y-z"
补充:其他SQL数据库的类似写法
如果是在其他数据库里,逻辑是一样的,只是函数名可能不同:
- PostgreSQL:同样用
STRING_AGG(grouping, '-' ORDER BY date) - Oracle:用
LISTAGG(grouping, '-') WITHIN GROUP (ORDER BY date) - MySQL:用
GROUP_CONCAT(grouping ORDER BY date SEPARATOR '-')
内容的提问来源于stack exchange,提问作者AI52487963
相关产品推荐
相关产品推荐

