2016-01-08 45 views
1

我正在計算谷歌大查詢中各欄的累計總和。谷歌大查詢:窗口函數行明智橫跨列的累積和

假設有五列(NAME,A,B,C,D)與整數的兩排,例如:

NAME | A | B | C | D 
---------------------- 
Bob | 1 | 2 | 3 | 4 
Carl | 5 | 6 | 7 | 8 

我找了一個窗口函數或UDF計算跨行累積和生成的輸出:

NAME | A | B | C | D 
------------------------- 
Bob | 1 | 3 | 6 | 10 
Carl | 5 | 11 | 18 | 27 

任何想法或建議非常感謝!

+0

你有一個率低。重要的是,您必須使用投票下方發佈答案左側的勾號標記接受的答案。這會增加你的速度。通過查看這個鏈接瞭解它的工作原理:http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work#5235 – Pentium10

回答

0

沒有必要爲一個UDF:

SELECT name, a, a+b, a+b+c, a+b+c+d 
FROM tab 
+0

感謝您的回覆。這絕對適用於四列,但會出現問題,比如90列 – echoecho256

+1

需要使用某些腳本編寫或生成SQL,列名明確需要寫入查詢中。 – Pentium10

+0

@ echoecho256:當你有* 90 *列時,你不應該寫* 4 *。但無論如何,*窗口函數*工作在行上,而不是列,UDF將被調用90次,使用不同的參數,或者您需要創建90個不同的UDF。順便說一句,看起來像一個非規範化的表,如果你需要做這樣的計算... – dnoeth

1

我認爲,大多有在設計好你的表的面積爲你的要求合理解決方法的數量。所有這一切都取決於你如何輸入你的數據,最重要的是你如何輸入數據,而且最重要的是你如何消費它

如果要保持所提出的要求 - 下面的內容並不完全是你期望在你的問題中作爲輸出,但可能是有用的例如:

SELECT name, GROUP_CONCAT(STRING(cum)) AS all FROM (
    SELECT name, 
    SUM(INTEGER(num)) 
    OVER(PARTITION BY name 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum 
    FROM (
    SELECT name, SPLIT(all) AS num FROM (
     SELECT name, 
     CONCAT(STRING(a),',',STRING(b),',',STRING(c),',',STRING(d)) AS all 
     FROM yourtable 
    ) 
) 
) 
GROUP BY name 

輸出是:

name all 
Bob  1,3,6,10  
Carl 5,11,18,26 

要看你不是消費這個數據 - 它仍然可以爲你工作 注意,不是你現在避免寫的東西像COL1 COL2 + + .. + col89 + col90 - 但仍然n明確提及每列只是一個。

的情況下,如果你有實現吉貝UI之外你的要求的「奢侈品」,而是在一些Client - 您可以使用BigQuery API以編程AQUIRE表模式,並建立在飛到你的邏輯/查詢和比執行它 拿看看下面的API入手:
要得到表結構 - https://cloud.google.com/bigquery/docs/reference/v2/tables/get
要發出查詢的工作 - https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert

+0

重要的是,「在閱讀某人對你的問題的回答後,你應該做的第一件事就是對答案進行投票,就像任何其他用戶(有足夠的聲譽)一樣。投票回答有用的答案,並接受你認爲對你最有幫助的答案。還有更多...當有人回答你的問題時,你可以檢查怎麼做 - http://stackoverflow.com/help/someone-answers和http://meta.stackexchange.com/questions/5234/how-does -accepting-的回答工作#5235 –