大查询重复数据删除查询示例说明

时间:2018-12-11 07:16:19

标签: google-bigquery

任何人都可以解释此Bigquery查询中的重复数据删除吗? 为什么我们需要使用[OFFSET(0)]? 我认为它是用来获取聚合数组中的第一个元素的吗? 与LIMIT 1不一样吗? 为什么我们需要汇总整个表? 为什么我们可以在一个单元格中汇总整个表?

 # take the one name associated with a SKU
    WITH product_query AS (
      SELECT 
      DISTINCT 
      v2ProductName,
      productSKU
      FROM `data-to-insights.ecommerce.all_sessions_raw` 
      WHERE v2ProductName IS NOT NULL 
    )
    SELECT k.* FROM (
    # aggregate the products into an array and 
      # only take 1 result
      SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k 
      FROM product_query x 
      GROUP BY productSKU # this is the field we want deduplicated
    );

1 个答案:

答案 0 :(得分:3)

让我们从一些我们要删除重复数据的数据开始:

WITH table AS (SELECT * FROM UNNEST([STRUCT('001' AS id, 1 AS a, 2 AS b), ('002', 3,5), ('001', 1, 4)]))

SELECT *
FROM table t

enter image description here

现在,我将使用*而不是t来引用整行:

SELECT t
FROM table t

enter image description here

如果我将每行按其ID分组会发生什么情况?

SELECT t.id, ARRAY_AGG(t) tt
FROM table t
GROUP BY 1

enter image description here

现在,我将所有具有相同ID的行组合在一起。但我只能选择一个:

SELECT t.id, ARRAY_AGG(t LIMIT 1) tt
FROM table t
GROUP BY 1

enter image description here

这看起来不错,但是在一个数组中仍然是一行。如何只获取行而不获取数组:

SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
FROM table t
GROUP BY 1

enter image description here

如果我想返回没有分组idtt前缀的行:

SELECT tt.*
FROM (
  SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
  FROM table t
  GROUP BY 1
)

enter image description here

这就是您根据行ID重复删除行的方式。