【问题标题】:How to generate series in BigQuery Standard SQL如何在 BigQuery 标准 SQL 中生成系列
【发布时间】:2016-12-17 12:06:59
【问题描述】:

我需要在每行生成 say 600 个连续数字(以 51 开头)的表格
如何使用 BigQuery 标准 SQL 执行此操作?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    在标准 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;
    

    【讨论】:

    • @Elliott Brossard,看起来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. 我不想让创建会导致查询失败的数组变得容易。不过,请参阅我的更新答案。
    【解决方案2】:

    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
    

    从那里您可以调整逻辑例如以获得连续的天数和其他序列

    【讨论】:

    • 我正在为标准 SQL 准备一些更好的东西 - 不幸的是它还没有可用 :( 我会收藏这篇文章并在我有东西要分享时添加一个答案。
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2019-07-18
    • 2016-11-23
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多