如何在BigQuery中对数据集所有表用FOR SYSTEM_TIME统计历史行数?
解决BigQuery批量查询数据集所有表历史行数的问题
你遇到的问题核心是:FOR SYSTEM_TIME AS OF 只能作用于带版本历史的实际基表,而你用WITH获取的是INFORMATION_SCHEMA的元数据视图,不是实际的版本化表,所以会报错。要批量处理所有表,得用动态SQL来生成每个表的查询语句并执行。
具体实现代码
DECLARE sql_string STRING; WITH table_queries AS ( -- 为每个表生成单独的历史行数统计语句 SELECT CONCAT( 'SELECT "', table_name, '" AS table_name, ', 'COUNT(*) AS row_count ', 'FROM `your-project.your-dataset.', table_name, '` ', 'FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR)' ) AS single_query FROM `your-project.your-dataset`.INFORMATION_SCHEMA.TABLES WHERE table_type = 'BASE TABLE' -- 仅统计基表,排除视图(视图无版本历史) ) -- 把所有单表查询拼接成UNION ALL的大SQL SELECT STRING_AGG(single_query, ' UNION ALL ') INTO sql_string FROM table_queries; -- 执行动态生成的SQL EXECUTE IMMEDIATE sql_string;
关键说明
- 替换占位符:把
your-project和your-dataset换成你实际的项目ID和数据集名称 - 时间调整:可以修改
INTERVAL 48 HOUR为你需要的历史时间点 - 表过滤:如果需要包含视图,去掉
WHERE table_type = 'BASE TABLE',但注意视图不支持SYSTEM_TIME逻辑,会报错 - 特殊表名处理:代码里用反引号包裹了表的全路径,即使表名包含空格或特殊符号也能正常执行
内容的提问来源于stack exchange,提问作者Kasrel
相关产品推荐
相关产品推荐

