如何在逗号分隔的字符串行中找到不同的元素?
Posted
技术标签:
【中文标题】如何在逗号分隔的字符串行中找到不同的元素?【英文标题】:How to find distinct elements in a comma seperated line of string? 【发布时间】:2019-06-05 07:51:02 【问题描述】:我喜欢找到不同的元素并将它们排列在一行字符串中,使用标准 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 没有匹配的签名 类型:数组、字符串”
任何关于使用其他功能或改变结构的建议。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:使用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),
','
)
给出想要的结果。
【讨论】:
以上是关于如何在逗号分隔的字符串行中找到不同的元素?的主要内容,如果未能解决你的问题,请参考以下文章