Sql 如何在BigQuery中求两个数组的交集
我有如下数据:Sql 如何在BigQuery中求两个数组的交集,sql,google-bigquery,Sql,Google Bigquery,我有如下数据: id col1 col2 ----------------- 1 [1,2] [2,3] 2 [4,4,6] [6,7] id col3 --------- 1 [2] 2 [6] 我想得到如下数据: id col1 col2 ----------------- 1 [1,2] [2,3] 2 [4,4,6] [6,7] id col3 --------- 1 [2] 2 [6] 有什么聪明的解决方案
id col1 col2
-----------------
1 [1,2] [2,3]
2 [4,4,6] [6,7]
id col3
---------
1 [2]
2 [6]
我想得到如下数据:
id col1 col2
-----------------
1 [1,2] [2,3]
2 [4,4,6] [6,7]
id col3
---------
1 [2]
2 [6]
有什么聪明的解决方案吗?对不起,我自己解决了:
#standardSQL
CREATE TEMPORARY FUNCTION intersection(x ARRAY<INT64>, y ARRAY<INT64>)
RETURNS INT64
LANGUAGE js AS """
var res = x.filter(value => -1 !== y.indexOf(value));
return res;
;
""";
#标准SQL
创建临时函数交点(x阵列、y阵列)
返回INT64
语言js为“”
var res=x.filter(值=>-1!==y.indexOf(值));
返回res;
;
""";
欢迎任何其他更聪明的想法!
谢谢。您可以使用
INTERSECT DISTINCT
-- build example table
WITH example as (
SELECT
* FROM UNNEST([
STRUCT([1,2] as col1, [2,3] as col2),
STRUCT([4,4,6],[6,7])
])
)
-- INTERSECT per row on two arrays
SELECT
ARRAY(SELECT * FROM example.col1
INTERSECT DISTINCT
(SELECT * FROM example.col2)
) AS result
FROM example
另一种选择
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT 1 id, [1,2,3] col1, [2,3] col2, [2,3,7] col3 UNION ALL
SELECT 1, [4,4,6], [6,7], [5,6]
)
SELECT
id,
ARRAY(
SELECT DISTINCT a
FROM t.col1 a, t.col2 b, t.col3 c
WHERE a = b AND b = c
) AS result
FROM `project.dataset.your_table` t
以上可以更紧凑,尤其是如果您有两个以上的列来处理
,您可以考虑进一步推广为SQL UDF和利用参数。这两个数组需要共享相同的元素类型,并且类型必须为 以及利用:SELECT
array_intersect([1,2,3],[2,3,4]) as i1,
array_intersect(["a","b","c"],["foo","a"]) as i2
我继续添加了缺失的
数组
谢谢你,米哈伊尔!你一个字的修改帮了我很大的忙!我可以使用多个相交元素。我发现这种方法比使用UDF快得多。