給定一個帶有一些排序和一些數字的BigQuery表,我想計算一個數字的「移動最大值」 - 類似於移動平均值,但是取代最大值。從Trying to calculate EMA (exponential moving average) using BigQuery看起來最好的方法是使用LEAD()
,然後自己進行聚合。 (Bigquery moving average基本上暗示了CROSS JOIN
,但是由於數據的大小,這看起來會很慢)。計算BigQuery中的移動最大值
理想情況下,我可能只能從單個重複字段返回而不是20個單獨字段內部查詢,然後使用正常的聚合重複字段,但我還沒有想出一個辦法做到這一點,所以我堅持滾動自己的聚合。雖然這對於總計或平均值來說足夠簡單,但計算最大內聯是相當棘手的,我還沒有想出一個好辦法來做到這一點。 (下面的例子當然是爲了使用公共數據集而設計的,它們也可以在3個元素之間進行滾動,而我想這樣做的時間在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'
)
這是O(n^2),但它至少起作用。我還可以做的IF
個嵌套鏈,就像這樣:
SELECT word,
IF(word_count >= word_count_1,
IF(word_count >= word_count_2, word_count, word_count_2),
IF(word_count_1 >= word_count_2, word_count_1, word_count_2)) AS max_count
FROM ...
這是O(n)來評估,但查詢的大小是n的指數,所以我不認爲這是一個很好的選擇;肯定會超過n = 20的BigQuery查詢大小限制。我也可以做n個嵌套查詢:
SELECT word,
IF(word_count_2 >= max_count, word_count_2, max_count) AS max_count
FROM (
SELECT word,
IF(word_count_1 >= word_count, word_count_1, word_count) AS max_count
FROM ...
)
雖然,看起來做20個嵌套查詢可能不是一個好主意。
有沒有一種很好的方法來做這種查詢?如果不是,我是否正確地認爲n在20左右,第一個是最不好的?
謝謝!我想知道你的計劃是什麼:)./ –
你的意思是我在做什麼? –
我GOOGLE了你的名字,他們說你是一個高手孩子:) –