【问题标题】:Remove duplicate values between arrays in BigQuery删除 BigQuery 中数组之间的重复值
【发布时间】:2019-12-22 16:25:16
【问题描述】:

假设我有以下数组:

SELECT ['A', 'B', 'C', 'A', 'A', 'A'] AS origin_array
UNION ALL
SELECT ['A', 'A', 'B'] AS secondary_array

我想删除数组之间(而不是数组内)的所有重复值,以便最终结果是:

SELECT ['C', 'A', 'A'] AS result_array

知道怎么做吗?

【问题讨论】:

  • 请解释去重的逻辑!期望的结果是如何计算出来的?
  • 哦,我想我明白了——很有趣——它的真正用例是什么——你能分享一下吗?

标签: google-cloud-platform google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
CREATE TEMP FUNCTION DEDUP_ARRAYS(arr1 ANY TYPE, arr2 ANY TYPE) AS ((ARRAY(
  SELECT item FROM (
    SELECT item, ROW_NUMBER() OVER(PARTITION BY item) pos FROM UNNEST(arr1) item UNION ALL
    SELECT item, ROW_NUMBER() OVER(PARTITION BY item) pos FROM UNNEST(arr2) item
  )
  GROUP BY item, pos
  HAVING COUNT(1) = 1
)));
WITH `project.dataset.table` AS (
  SELECT ['A', 'B', 'C', 'A', 'A', 'A'] AS origin_array, ['A', 'A', 'B'] AS secondary_array
)
SELECT DEDUP_ARRAYS(origin_array, secondary_array) AS result_array
FROM `project.dataset.table`  

结果

Row result_array     
1   A    
    A    
    C      

SELECT ['C', 'A', 'A'] AS result_array 会返回什么

【讨论】:

  • 完美!我有几个用例,它们都有相似的目的。例如,假设我需要缝制两件套(衬衫和裤子)。我有一份整套西装所需物品的清单,以及衬衫所需的所有物品。如果我能从“西装项目”中减去“衬衫项目”,我就可以准确地知道裤子需要哪些项目,从而使用更少的数据。
【解决方案2】:

如果您只输入UNION 而不是UNION ALL,则不应采用重复值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2021-09-30
    • 2014-10-10
    相关资源
    最近更新 更多