任何人都可以解释此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
);
答案 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
现在,我将使用*
而不是t
来引用整行:
SELECT t
FROM table t
如果我将每行按其ID分组会发生什么情况?
SELECT t.id, ARRAY_AGG(t) tt
FROM table t
GROUP BY 1
现在,我将所有具有相同ID的行组合在一起。但我只能选择一个:
SELECT t.id, ARRAY_AGG(t LIMIT 1) tt
FROM table t
GROUP BY 1
这看起来不错,但是在一个数组中仍然是一行。如何只获取行而不获取数组:
SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
FROM table t
GROUP BY 1
如果我想返回没有分组id
或tt
前缀的行:
SELECT tt.*
FROM (
SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
FROM table t
GROUP BY 1
)
这就是您根据行ID重复删除行的方式。