如何在逗号分隔的字符串行中找到不同的元素?

时间:2019-06-05 07:51:02

标签: google-bigquery

我喜欢查找不同的元素并将它们排列在一行字符串中,并使用标准SQL(BigQuery)将其用逗号分隔。

我已经有一个字符串,如:

  

B,A,A,D,C,B

我喜欢生成:

  

A,B,C,D

我尝试使用 STRING_AGG 函数。

SELECT STRING_AGG(DISTINCT split(str,","), "," ORDER BY str ASC )  AS string_agg
FROM  UNNEST ( [(select f0_ from temp3 )]) AS str

我得到了错误:

  

“参数的聚集函数STRING_AGG没有匹配的签名   类型:ARRAY,STRING”

关于使用其他功能或更改结构的任何建议。

2 个答案:

答案 0 :(得分:1)

使用split函数是一个好主意。它返回一个字符串数组,您可以对字符串进行排序并从中删除重复项。最后,如果要输出字符串,可以使用ARRAY_TOSTRING函数。

将其全部放入,然后运行以下查询:

SELECT ARRAY_TO_STRING(
    ARRAY(SELECT DISTINCT x FROM UNNEST(split('b,a,a,b,d,c')) AS x ORDER BY x),
    ','
)

给出期望的结果。

答案 1 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`  

您可以使用下面的示例中的虚拟数据来测试,玩游戏

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
WITH `project.dataset.table` AS (
  SELECT 'B,A,A,D,C,B' str UNION ALL
  SELECT 'X,X,Z,Y,Y'
)
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`   

有结果

Row string_agg   
1   A,B,C,D  
2   X,Y,Z