如何从 NESTED 字段中的 ARRAY 中删除 STRUCT
How to delete a STRUCT from an ARRAY in the NESTED field
有没有一种简单的方法可以从 BigQuery 中的嵌套和重复字段中删除 STRUCT(BQ table 列类型:RECORD,模式:REPEATED)。
假设我有以下 tables:
- 心愿单
name toy.id toy.priority
Alice 1 high
2 medium
3 low
Kazik 3 high
1 medium
- 玩具
id name available
1 car 0
2 doll 1
3 bike 1
我想从愿望清单中删除不可用的玩具 (toys.available==0)。在这种情况下,它是 toy.id==1.
因此,愿望清单将如下所示:
name toy.id toy.priority
Alice 2 medium
3 low
Kazik 3 high
我知道如何select它:
WITH `project.dataset.wishlist` AS
(
SELECT 'Alice' name, [STRUCT<id INT64, priority STRING>(1, 'high'), (2, 'medium'), (3, 'low')] toy UNION ALL
SELECT 'Kazik' name, [STRUCT<id INT64, priority STRING>(3, 'high'), (1, 'medium')]
), toys AS (
SELECT 1 id, 'car' name, 0 available UNION ALL
SELECT 2 id, 'doll' name, 1 available UNION ALL
SELECT 3 id, 'bike' name, 1 available
)
SELECT wl.name, ARRAY_AGG(STRUCT(unnested_toy.id, unnested_toy.priority)) as toy
FROM `project.dataset.wishlist` wl, UNNEST (toy) as unnested_toy
LEFT JOIN toys t ON unnested_toy.id=t.id
WHERE t.available != 0
GROUP BY name
但是当 toys.available==0.
时,我不知道如何从愿望清单中删除结构
有非常相似的问题,例如 or How to Delete rows from Structure in bigquery,但我在删除方面不清楚答案,或者建议使用 selection 将整个心愿单复制到新的 table陈述。我的 'wishlist' 很大而且 'toys.availabililty' 经常变化。复制它在我看来效率很低。
能否建议一个符合 BQ 最佳实践的解决方案?
谢谢!
您可以 UNNEST()
并重新聚合:
SELECT wl.name,
(SELECT ARRAY_AGG(t)
FROM UNNEST(wl.toy) t JOIN
toys
ON toys.id = t.id
WHERE toys.available <> 0
) as available_toys
FROM `project.dataset.wishlist` wl;
... since row Deletion was implemented in BQ, I thought that STRUCT deletion inside a row is also possible.
您可以为此使用 UPDATE DML(不是 DELETE,因为它用于删除整行,而 UPDATE 可用于修改行)
update `project.dataset.wishlist` wl
set toy = ((
select array_agg(struct(unnested_toy.id, unnested_toy.priority))
from unnest(toy) as unnested_toy
left join `project.dataset.toys` t on unnested_toy.id=t.id
where t.available != 0
))
where true;
有没有一种简单的方法可以从 BigQuery 中的嵌套和重复字段中删除 STRUCT(BQ table 列类型:RECORD,模式:REPEATED)。
假设我有以下 tables:
- 心愿单
name toy.id toy.priority
Alice 1 high
2 medium
3 low
Kazik 3 high
1 medium
- 玩具
id name available
1 car 0
2 doll 1
3 bike 1
我想从愿望清单中删除不可用的玩具 (toys.available==0)。在这种情况下,它是 toy.id==1.
因此,愿望清单将如下所示:
name toy.id toy.priority
Alice 2 medium
3 low
Kazik 3 high
我知道如何select它:
WITH `project.dataset.wishlist` AS
(
SELECT 'Alice' name, [STRUCT<id INT64, priority STRING>(1, 'high'), (2, 'medium'), (3, 'low')] toy UNION ALL
SELECT 'Kazik' name, [STRUCT<id INT64, priority STRING>(3, 'high'), (1, 'medium')]
), toys AS (
SELECT 1 id, 'car' name, 0 available UNION ALL
SELECT 2 id, 'doll' name, 1 available UNION ALL
SELECT 3 id, 'bike' name, 1 available
)
SELECT wl.name, ARRAY_AGG(STRUCT(unnested_toy.id, unnested_toy.priority)) as toy
FROM `project.dataset.wishlist` wl, UNNEST (toy) as unnested_toy
LEFT JOIN toys t ON unnested_toy.id=t.id
WHERE t.available != 0
GROUP BY name
但是当 toys.available==0.
时,我不知道如何从愿望清单中删除结构有非常相似的问题,例如
能否建议一个符合 BQ 最佳实践的解决方案?
谢谢!
您可以 UNNEST()
并重新聚合:
SELECT wl.name,
(SELECT ARRAY_AGG(t)
FROM UNNEST(wl.toy) t JOIN
toys
ON toys.id = t.id
WHERE toys.available <> 0
) as available_toys
FROM `project.dataset.wishlist` wl;
... since row Deletion was implemented in BQ, I thought that STRUCT deletion inside a row is also possible.
您可以为此使用 UPDATE DML(不是 DELETE,因为它用于删除整行,而 UPDATE 可用于修改行)
update `project.dataset.wishlist` wl
set toy = ((
select array_agg(struct(unnested_toy.id, unnested_toy.priority))
from unnest(toy) as unnested_toy
left join `project.dataset.toys` t on unnested_toy.id=t.id
where t.available != 0
))
where true;