BigQuery对SELECT中多个字符串列的CONCAT进行排序

时间:2019-10-28 21:48:37

标签: sql google-bigquery

首先,我将介绍我要实现的目标的示例,然后将分享更多信息。这是一个相对简单的任务,需要解释,但是我是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

...这会合并列,但显然不会以排序的方式进行。感谢您提供任何帮助!

2 个答案:

答案 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