2013-08-05 37 views
0

Google Big Query中最近宣佈的(並且期待已久的)窗口分析函數似乎非常不完整。下面是應該計算(在本例中3)的幾種組合的加權分數財務指標公司(這部作品在Oracle和MS SQL!)查詢:Google Big Query(GBQ)中窗口函數的不完整實現所需的解決方法

select 
    ( percent_rank() over (order by cash_discount desc)*0.4 
    +percent_rank() over (order by trailing_pe desc)*0.5 
    +percent_rank() over (order by forward_pe desc)*0.5 
) combined_weighted_score 
,company_symbol, company_name 
from workspace.company c 

在吉貝我們得到:錯誤:遇到「‘OVER’」過‘’在第2行

我決定進一步研究這個問題 - 這裏是一個更簡單的查詢:

select 
     percent_rank() over (order by cash_discount desc) r1 
    ,percent_rank() over (order by trailing_pe desc) r2 
    ,percent_rank() over (order by forward_pe desc) r3 
    ,company_symbol, company_name 
from workspace.company c 

這讓我這樣的:錯誤:多重獨特OVER子句尚未支持。如果查詢中出現多個OVER子句,則它們必須相同。發現分類規格在分類密鑰方面有所不同0

因此,GBQ似乎對分析窗函數的實現非常不完整! 接下來,我嘗試了一些醜陋的黑客一樣:

select c.company_name, (r1.r*0.4+r2.r*0.5) combined_weighted_score 
from [workspace.company] c 
left join (select company_symbol, percent_rank() over (order by cash_discount desc) r from workspace.company) r1 
    on c.company_symbol=r1.company_symbol 
left join (select company_symbol, percent_rank() over (order by trailing_pe desc) r from workspace.company) r2 
    on c.company_symbol=r2.company_symbol 

好,仍然不能正常工作:

錯誤:5.1 - 0.0:查詢不能有多個JOIN子句

任何解決方案?我知道如果沒有正確實現的窗口函數的幫助,這在傳統的SQL中很難實現。但GBQ的宣佈聽起來很有希望......

回答

2

你幾乎明白了!

每個OVER()子句在同一個SELECT語句中需要相同的謂詞,但您可以加入2個不同的表 - 正如您發現的那樣。

只有2個表可以加入,但你需要3.簡單的解決方法是做一個子查詢並加入一個。

相反的:

SELECT x.a, y.b, z.c 
FROM x JOIN y ON x.j=y.j JOIN z ON y.j=z.j 

你可以這樣做:

SELECT x.a, yz.b, yz.c 
FROM x JOIN (
    SELECT y.b b, z.c c, y.j j 
    FROM y JOIN z on y.j=z.j) yz 
ON x.j=yz.j 

(您可能需要更改連接的JOIN EACH)

+0

Fh的感謝!解決方法是有效的,但是這種不必要的嵌套連接不會贏得任何選美比賽:-)我仍然希望GBQ團隊監控他們的客戶的痛苦,並且至少在下一個版本中: 1.刪除限制只有一個在同一個SELECT中輸入OVER子句 2.認識到像0.4 *(percent_rank()over(...))這樣的表達式完全合法謝謝解決方法。我仍然希望GBQ團隊監測他們客戶的痛苦,至少會這樣做: – user2264178

+0

據我所知 - GBQ團隊喜歡他們的用戶。感謝您的反饋,並保持它來:)。 –