给定一个带有一些排序的BigQuery表和一些数字,我想计算数字的"移动最大值" - 类似于移动平均线,但是最大值.从尝试使用BigQuery计算EMA(指数移动平均值)看来,最好的方法是使用LEAD()然后自己进行聚合.(Bigquery移动平均线表明基本上是一个CROSS JOIN,但考虑到数据的大小,这看起来似乎很慢.)
理想情况下,我也许能够只返回一个单一的重复场,而不是20个个人领域,从内部查询,然后使用普通聚集在重复场,但我还没有想出一个办法做到这一点,所以我我坚持滚动自己的聚合.虽然这对于求和或平均来说很容易,但计算最大内联是非常棘手的,我还没有想出一个好方法.
(下面的例子当然是为了使用公共数据集有点做作.他们还做滚动最大超过300元,而我想这样做对周围20我已经生成的查询程序,因此使得它简短不是一个大问题.)
一种方法是执行以下操作:
SELECT word,
(CASE
WHEN word_count >= word_count_1 AND word_count >= word_count_2 THEN word_count
WHEN word_count_1 >= word_count AND word_count_1 >= word_count_2 THEN word_count_1
ELSE word_count_2 END
) AS max_count
FROM (
SELECT word, word_count,
LEAD(word_count, 1) OVER (ORDER BY word) AS word_count_1,
LEAD(word_count, 2) OVER (ORDER BY word) AS word_count_2,
FROM [publicdata:samples.shakespeare]
WHERE corpus = 'macbeth'
)
Run Code Online (Sandbox Code Playgroud)
这是O(n ^ 2),但它至少有效.我也可以做一个嵌套的IFs 链,像这样:
SELECT word, …Run Code Online (Sandbox Code Playgroud)