从 BigQuery 中的数组中删除重复项

Posted

技术标签:

【中文标题】从 BigQuery 中的数组中删除重复项【英文标题】:Remove duplicates from an array in BigQuery 【发布时间】:2022-01-09 01:40:00 【问题描述】:

我在 BigQuery 中工作,我的一个表有一个数组,其中包含我想弄清楚如何删除的重复项。我能够使用 CTE 识别问题行,但实际上删除它们是我卡住的地方。

让我提供一个例子来提供更多的上下文:

Order Item.Sku Item.Quantity Item.Price Shipment.Ship_Number
123 ABC 2 5.99 UPS123
ABC 2 5.99 UPS234
XYZ 1 19.99
456 ABC 2 5.99 UPS456
789 XYZ 1 19.99 UPS789

因此查看此表(对于代码,将其称为 Order_Table),我只想删除订单 123 的 Item 数组中的第二个“行” - 因为 sku、数量和价格都是相同的。尽管订单 456 和 789 在 Item 数组中具有相同的信息,但它们不被视为重复,因为它们具有不同的订单号。我还包括了一个额外的数组 Shipment,因为我正在处理一个包含多个数组的表,所以我想确保任何解决方案都考虑到这一点。所以在重复删除之后,我想这样结束:

Order Item.Sku Item.Quantity Item.Price Shipment.Ship_Number
123 ABC 2 5.99 UPS123
XYZ 1 19.99 UPS234
456 ABC 2 5.99 UPS456
789 XYZ 1 19.99 UPS789

任何想法如何到达那里?如果您有任何问题,请随时提出,我很乐意提供更多背景信息。谢谢!

编辑:这就是我使用 CTE 识别问题行的方式:

select * from
(select item.*
,row_number() over (
  partition by 
    order,
    item.sku,
    item.quantity,
    item.price
  order by item.sku)
    as row_id
    from Order_Table t, t.Item item)
  where row_id > 1

【问题讨论】:

I'm able to identify the problem rows using a CTE - 显示您的进度,这样我们就不会重复您已经完成的工作 【参考方案1】:

如果您想在 BigQuery 中对数组进行重复数据删除,1) 您首先必须展平数组。 2) 随后,可以像往常一样进行重复数据删除(例如,使用 distinct 或 grouping 等) 3) 最后,要返回一个数组(作为原始模式),我们可以对主键进行分组并使用 ARRAY_AGG

1) 数组的展平是使用UNNEST 运算符完成的。

UNNEST 运算符接受一个 ARRAY 并返回一个表,其中 ARRAY 中的每个元素对应一行。

结合CROSS JOIN,我们为每个数组记录检索一行。 (注意,逗号表示CROSS JOIN,参见docs)

SELECT 
  order_id,
  item.sku AS item_sku,
  item.price AS item_price
FROM data, UNNEST(items) AS item

2) 使用DISTINCT 我们检索唯一记录。

SELECT DISTINCT
  order_id,
  item.sku AS item_sku,
  item.price AS item_price
FROM data, UNNEST(items) AS item

3) 我们可以对主键 (order_id) 进行分组,并使用 ARRAY_AGG 将结果作为数组返回。即,返回原始模式。

SELECT 
  order_id,
  ARRAY_AGG(
    STRUCT(
      item_sku AS sku,
      item_price AS price
    ) 
  ) AS item
FROM flattened
GROUP BY order_id


完整的可重现示例

WITH data AS (
  SELECT 
    123 AS order_id,
    [
      STRUCT(
        'ABC' AS sku,
        5.99 AS price
      ),
      STRUCT(
        'ABC' AS sku,
        5.99 AS price
      ),
      STRUCT(
        'XYZ' AS sku,
        19.99 AS price
      )
    ] AS items,
  
  UNION ALL
  
  SELECT 
    456, 
    [
      STRUCT(
        'ABC' AS sku,
        5.99 AS price
      )
    ]
    
  UNION ALL
  
  SELECT 
    789, 
    [
      STRUCT(
        'XYZ' AS sku,
        19.99 AS price
      )
    ]
),

flattened AS (
  SELECT DISTINCT
    order_id,
    item.sku AS item_sku,
    item.price AS item_price
  FROM data, UNNEST(items) AS item
)

SELECT 
  order_id,
  ARRAY_AGG(
    STRUCT(
      item_sku AS sku,
      item_price AS price
    ) 
  ) AS item
FROM flattened
GROUP BY order_id

【讨论】:

以上是关于从 BigQuery 中的数组中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从Google BigQuery中的嵌套表中删除重复项

在 Bigquery 中使用结构数组删除重复项并选择不同的值

BigQuery 标准 SQL:从表中删除重复项

从 Kotlin 中的数组中删除重复项

从数组中删除重复的对象

从 C++ 中的数组中删除重复项 [关闭]