2014-01-07 52 views
1

您將如何克服上述限制?JOIN EACH和GROUP EACH BY子句不能用於窗口函數的輸出

我想使用LEAD和LAG窗口函數根據3條記錄的序列找到流,然後計算它們屬性的某些聚合(計數,總和等)。

當我在少量的數據樣本上運行我的查詢時,一切都很好,並通過運行組確定。但是當運行在更大的數據集上時,我得到:「在查詢執行過程中超出資源。查詢包含GROUP BY運算符,請考慮使用GROUP EACH BY。」

在其他許多情況下切換到GROUP分別由做的工作...... 然而,當我使用的窗口功能,我不能使用的每個...

有什麼建議?最佳實踐?

這裏是一個基於維基百科樣本數據的示例查詢。它顯示了不同貢獻者編輯標題的頻率。 where條件只是爲了限制響應大小,如果你刪除了「B」,我們得到的結果,如果我們添加它,我們得到了「使用EACH」推薦。

select title,count (case when contributor_id<>LeadContributor then 1 else null end) as different, 
count (case when contributor_id=LeadContributor then 1 else null end) as same, 
count(*) as total 
from 
(
SELECT title,contributor_id,lead(contributor_id)over(partition by title order by timestamp) as LeadContributor 
FROM [publicdata:samples.wikipedia] 
where regexp_match(title,r'^[A,B]')=true) 
group by title 

感謝

+0

你能提供一個樣本數據集?示例查詢? –

+0

你能提供你的用戶嗎?我會授予您讀取我的生產環境的權限並共享我有問題的查詢。 –

+0

嗨user2881671;我更願意先公開討論查詢和/或數據。對於24x7一對一支持,Google提供高級支持套餐,而StackOverflow則致力於成爲一個基於社區的頻道。如果你願意分享更多,有很多人可以從這個問題中得到幫助和學習。 –

回答

0

我猜你的特定用例的樣本查詢不同,但讓我什麼,我能看到評論:

  • 你找到一種方法,使GROUP EACH和OVER可能:將OVER()查詢與另一個OVER()查詢包圍在一起,可以將GROUP BY更改爲GROUP EACH BY。但是,這個查詢的問題不存在。
  • 讓我們忘掉GROUP和GROUP EACH。讓我們來看看核心查詢:

    SELECT title, contributor_id, LEAD(contributor_id) 
        OVER(PARTITION BY title ORDER BY timestamp) AS LeadContributor 
    FROM [publicdata:samples.wikipedia] 
    WHERE REGEXP_MATCH(title, r'^[A,B]') 
    
  • 此查詢失敗,R '^ [A,B]' 和有R作品 '^ [A]',它強調的OVER()的限制:由於GROUP BY和ORDER BY,它僅適用於數據適合一臺機器,因爲它們不可並行化。正如r'^ [A]'的答案所揭示的那樣,這可能是很多數據 - 儘管有時還不夠。這就是爲什麼BigQuery提供可並行化的GROUP EACH BY的原因。然而,我們可以在這裏使用的並不是可以並行化的OVER EACH BY。

  • 我在這裏應用的解決方法正是你在做什麼:做OVER()只有一小部分數據。

(順便說一句,我說我愛示例查詢......這是一個有趣的回答一個有趣的問題!)

+1

正如你所猜測的,我的具體情況是不同的。不幸的是,查詢塊對我來說太複雜了......我重寫了沒有窗口函數的查詢,但是有一些沉重的連接和聚合(Min,Max)......代碼沒有我希望的那樣優雅,但它工作:) –