重用BigQuery窗口功能分区

时间:2016-02-19 19:11:57

标签: google-bigquery

我需要选择多个列作为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是否会在查询运行时针对此进行优化以提高效率?

1 个答案:

答案 0 :(得分: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和a.POS = a。(POS + 1)< - 这只是逻辑,而不是实现
现在,您将在表中包含别名a和表别名b

中的所有下一个值的所有当前值

正如我所提到的,上面产生与窗口函数完全相同的结果,但代码看起来更难看,执行显示更昂贵