Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在BigQuery中求两个数组的交集_Sql_Google Bigquery - Fatal编程技术网

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快得多。