【问题标题】:Re-use BigQuery window function partition重用 BigQuery 窗口函数分区
【发布时间】:2016-06-01 11:43:06
【问题描述】:

我需要选择多个列作为 LEAD 语句的一部分。这看起来会非常低效,需要的排序和分区数量增加三倍 ->

SELECT 
    field,
    field2,
    field3,
    LEAD(field, 1) OVER (PARTITION BY field ORDER BY field ASC) AS nextField,
    LEAD(field2, 1) OVER (PARTITION BY field ORDER BY field ASC) AS nextField2,
    LEAD(field3, 1) OVER (PARTITION BY field ORDER BY field ASC) AS nextField3,
FROM dataset.table
  • 有没有更好的方法来做到这一点?
  • BigQuery 是否会在查询运行时对此进行优化以提高效率?

【问题讨论】:

  • 也许将字段连接成一个字段,然后进行引导,然后拆分该字符串。

标签: google-bigquery


【解决方案1】:

为米哈伊尔的回答添加几点:

  1. 是的,BigQuery 对其进行了优化 - 如果窗口框架相同,则只会设置一次,并且会运行多个函数。

  2. 您说得对,一遍又一遍地编写相同的框架很乏味,因此我们致力于改进 BigQuery SQL 方言以使其更符合标准,在不久的将来*您将能够编写


SELECT 
    field,
    field2,
    field3,
    LEAD(field, 1) OVER w1 AS nextField,
    LEAD(field2, 1) OVER w1 AS nextField2,
    LEAD(field3, 1) OVER w1 AS nextField3,
FROM dataset.table
WINDOW w1 AS (PARTITION BY field ORDER BY field ASC)

*不能真正给你确切的日期,但目前正在内部测试中,所以应该不会太长。

【讨论】:

    【解决方案2】:

    Window Functions 已经足够优雅,可以用 SQL 表达您的业务逻辑。尽管看起来您需要为 SELECT 语句的每个相应输出字段重复 PARTITION BY ... ORDER BY ... 部分,但我个人认为这不是窗口函数给我们的强大功能的大代价。
    顺便说一句,您不限于对所有输出字段使用相同的PARTITION BY - 您可以为每个字段使用您需要的任何分区。 ORDER BY 也一样

    BigQuery 是否会在查询运行时对此进行优化以提高效率?

    您可以在运行查询后查看Query Plan Explanation
    它清楚地表明无论您使用多少窗口函数,BigQuery 都会重复使用分区。看起来如果你有几个不同的分区,它们就会被级联。 (如果您看到查询计划,这也很清楚)

    有没有更好的方法来做到这一点?

    您可以通过多种方式模拟具有分区的窗口功能。它们似乎都不像使用窗口函数那样执行和/或可读/可管理

    例如,下面的逻辑将产生相同的结果(这里只是高级逻辑)。
    您将ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) as POS 应用于原始数据/表。
    比你用 ON a.partition=b.partition AND a.POS = a.(POS + 1) 所以现在,您将在表中拥有别名 a 的所有当前值,以及表别名 b 中的所有下一个值

    正如我提到的,上面产生的结果与窗口函数完全相同,但代码看起来更丑陋,执行成本更高

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2014-04-26
      • 2013-06-17
      • 2016-06-12
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多