从 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 中的数组中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章