google-bigquery - 如何使用数组更新 bigquery 表?
问题描述
我有一个包含日志数据的表,我想用后续查询的结果更新它,该查询将针对过滤的行插入结果。
我想使用 union all 来保留当前值并附加新值,但出现以下错误:
不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。
UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY(
(SELECT AS STRUCT
CURRENT_TIMESTAMP() as date,b.size_bytes,timestamp_millis(b.last_modified_time) AS last_modified_time,b.row_count
FROM `<DATASETNAME>.__TABLES__` b WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE())))
)
WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))
解决方案
下面根本没有经过测试,只是基于[希望]正确改组你的语法 - 所以它避免了“引用其他表的相关子查询”的问题
UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY(
SELECT AS STRUCT
CURRENT_TIMESTAMP() AS DATE,
b.size_bytes,
TIMESTAMP_MILLIS(b.last_modified_time) AS last_modified_time,
b.row_count
)
FROM `<DATASETNAME>.__TABLES__` b
WHERE a.table_id = b.table_id
AND a.table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))
请检查并让我知道它现在是否有效或仍需要一些调整
PS显然,以上假设其余逻辑是正确的
更新:如何保留 a.pinged 中已有的内容并使用当前存在的内容以及查询结果对其进行更新?
试试下面
UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY_CONCAT(a.pinged, ARRAY(
SELECT AS STRUCT
CURRENT_TIMESTAMP() AS DATE,
b.size_bytes,
TIMESTAMP_MILLIS(b.last_modified_time) AS last_modified_time,
b.row_count
))
FROM `<DATASETNAME>.__TABLES__` b
WHERE a.table_id = b.table_id
AND a.table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))
推荐阅读
- javascript - 如何为 [key, val] 定义 TS 类型?
- python - 如何使用 flexmock 模拟被测模块中的类或对象
- javascript - TypeError:无法解构 req.params 的属性 ID,因为它未定义
- c# - 如何在 c# 中提高经常使用位图的性能?
- sql - 使用 LEFT JOIN 计数记录
- sorting - 按数字和字母顺序对基于结构的切片进行排序
- c - 在 C 中定义结构类型的二维数组
- c# - 在字符串中查找所有带有 [tokens] 的子字符串,并将它们放在 int 数组中
- css - 用 :after 但最后用圆圈创建线条的最佳方法是什么?
- database - DynamoDB 中的选择 PK 和 SK