首先,我将介绍我要实现的目标的示例,然后将分享更多信息。这是一个相对简单的任务,需要解释,但是我是BigQuery的新手,因此不确定该任务是否易于实现。
我有一个名称数据集,正在尝试将这些名称合并为一列,但是名称需要首先排序。数据集如下所示:
p1 p2 p3 p4
Nick Tom Joe Chris
Sal Bill Tom Joe
Nick Joe Chris Sal
Nick Joe Joe Chris
我想创建第5列,以排序的方式连接p1,p2,p3和p4,这样输出就这样:
p1 p2 p3 p4 concat_col
Nick Tom Joe Chris Chris_Joe_Nick_Tom
Sal Bill Tom Joe Bill_Joe_Sal_Top
Nick Joe Chris Sal Chris_Joe_Nick_Sal
Nick Joe Tom Chris Chris_Joe_Nick_Top
目前我有以下
SELECT
p1, p2, p3, p4,
concat(p1, '_', p2, '_', p3, '_', p4) as concat_col
FROM
my_table
...这会合并列,但显然不会以排序的方式进行。感谢您提供任何帮助!
答案 0 :(得分:4)
您可以将字符串放入数组中,使其嵌套并重新聚合:
select t.*,
(select string_agg(el, '_' order by el)
from unnest(array[t.p1, t.p2, t.p3, t.p4]) el
) as str
from (select 'Nick' as p1, 'Tom' as p2, 'Joe' as p3, 'Chris' as p4 union all
select 'Sal', 'Bill', 'Tom', 'Joe' union all
select 'Nick', 'Joe', 'Chris', 'Sal' union all
select 'Nick', 'Joe', 'Joe', 'Chris'
) t ;
答案 1 :(得分:2)
在某些情况下-您可能不想依赖列名-通用代码确实可以帮助解决此问题
#standardSQL
SELECT *,
(
SELECT STRING_AGG(TRIM(item), '_' ORDER BY TRIM(item))
FROM UNNEST(REGEXP_EXTRACT_ALL(FORMAT('%t', t), r'[^(),]+')) item
) AS concat_col
FROM my_table t
如您所见,以上代码并未调出列名仍会产生预期结果
Row p1 p2 p3 p4 concat_col
1 Nick Tom Joe Chris Chris_Joe_Nick_Tom
2 Sal Bill Tom Joe Bill_Joe_Sal_Tom
3 Nick Joe Chris Sal Chris_Joe_Nick_Sal
4 Nick Joe Joe Chris Chris_Joe_Joe_Nick