【发布时间】:2016-12-17 12:06:59
【问题描述】:
我需要在每行生成 say 600 个连续数字(以 51 开头)的表格
如何使用 BigQuery 标准 SQL 执行此操作?
【问题讨论】:
标签: google-bigquery
我需要在每行生成 say 600 个连续数字(以 51 开头)的表格
如何使用 BigQuery 标准 SQL 执行此操作?
【问题讨论】:
标签: google-bigquery
在标准 SQL 中尝试GENERATE_ARRAY:
SELECT num FROM UNNEST(GENERATE_ARRAY(51, 650)) AS num;
编辑:如果您想要超过一百万个元素,您可以多次调用GENERATE_ARRAY,但请注意,如果您生成太多元素,查询可能会花费很长时间:
SELECT num1 * num2 AS num
FROM UNNEST(GENERATE_ARRAY(1, 1000000)) AS num1,
UNNEST(GENERATE_ARRAY(1, 100)) AS num2;
【讨论】:
GENERATE_ARRAY 将序列长度限制为恰好1048575,即2^20 - 1。你知道这个限制是为了什么或它来自哪里吗?我的用例涉及生成一个长度为 1 到 50 亿个条目的序列。我正在通过将序列写入 CSV 格式的存储桶并从那里导入表来解决它。
Enforce a hard limit of around a million elements to avoid generating arrays that are too large for constant folding or other parts of the runtime. 我不想让创建会导致查询失败的数组变得容易。不过,请参阅我的更新答案。
BigQuery 标准 SQL
SELECT 50 + ROW_NUMBER() OVER() AS num
FROM UNNEST((SELECT SPLIT(FORMAT("%600s", ""),'') AS h FROM (SELECT NULL))) AS pos
ORDER BY num
BigQuery 旧版 SQL
SELECT 50 + pos AS pos FROM (
SELECT ROW_NUMBER() OVER() AS pos, *
FROM (FLATTEN((SELECT SPLIT(RPAD('', 600, '.'),'') AS h FROM (SELECT NULL)), h))
) WHERE pos BETWEEN 1 AND 600
从那里您可以调整逻辑例如以获得连续的天数和其他序列
【讨论】: