2013-02-02 119 views
6

任何想法如何計算BigQuery SQL中的運行總數?BigQuery SQL運行總計

id value running total 
-- ----- ------------- 
1 1  1 
2 2  3 
3 4  7 
4 7  14 
5 9  23 
6 12  35 
7 13  48 
8 16  64 
9 22  86 
10 42  128 
11 57  185 
12 58  243 
13 59  302 
14 60  362 

不使用任何相關的標量查詢傳統的SQL服務器的一個問題:

SELECT a.id, a.value, (SELECT SUM(b.value) 
         FROM RunTotalTestData b 
         WHERE b.id <= a.id) 
FROM RunTotalTestData a 
ORDER BY a.id; 

或加入:

SELECT a.id, a.value, SUM(b.Value) 
FROM RunTotalTestData a, 
     RunTotalTestData b 
WHERE b.id <= a.id 
GROUP BY a.id, a.value 
ORDER BY a.id; 

但我不能找到一種方法,使其工作在BigQuery ...

回答

2

你可能已經知道了。但是這裏是一個,而不是最有效的方式:

JOIN只能使用相等比較來完成,即b.id < = a.id無法使用。

https://developers.google.com/bigquery/docs/query-reference#joins

,如果你問我,這是相當跛腳。但是有一項工作。只需使用一些虛擬值的相等比較來獲得笛卡爾積,然後使用WHERE來獲得< =。這是瘋狂的不理想。但是如果你的桌子很小,這將會起作用。

SELECT a.id, SUM(a.value) as rt 
FROM RunTotalTestData a 
JOIN RunTotalTestData b ON a.dummy = b.dummy 
WHERE b.id <= a.id 
GROUP BY a.id 
ORDER BY rt 

您可以手動約束時間,以及:

SELECT a.id, SUM(a.value) as rt 
FROM (
    SELECT id, timestamp RunTotalTestData 
    WHERE timestamp >= foo 
    AND timestamp < bar 
) AS a 
JOIN (
    SELECT id, timestamp, value RunTotalTestData 
    WHERE timestamp >= foo AND timestamp < bar 
) b ON a.dummy = b.dummy 
WHERE b.id <= a.id 
GROUP BY a.id 
ORDER BY rt 

更新:

你並不需要一個特殊的屬性。您可以使用

SELECT 1 AS one 

並加入。

隨着計費開始,連接表在處理中計數。

+0

非常感謝,這些查詢工作! – Sasa

+0

2013更新:你可以用SUM()OVER()的一個簡單的查詢http://stackoverflow.com/questions/14664578/bigquery-sql-running-totals/20480827#20480827 –

1

問題出在第二個查詢,那BigQuery會聯合FROM表單中的2個表格ñ。

我不確定第一個,但它可能是bigquery不喜歡選擇表達式的子選擇,只在FromExpression。所以你需要將子查詢移動到fromexpression中,並加入結果。

此外,您可以試一試我們的JDBC驅動程序: Starschema BigQuery JDBC Driver

只需簡單地將其加載到松鼠SQL或RazorSQL或還挺支持JDBC驅動程序的任何工具,請確保您打開查詢變壓器通過設置:

transformQuery =真

在性能還是在JDBC URL,每一個信息可以在項目頁面上找到。在完成此操作後,嘗試運行第二個查詢,它將轉換爲與BigQuery兼容的連接。

+0

你可以給的BigQuery查詢的例子嗎?我無法看到如何將子查詢從SELECT移動到FROM,因爲它引用B?你不能加入<=。我錯過了什麼? –

+0

感謝線索 - 但BQ JDBC驅動程序(和SquirrelSQL)沒有運氣 - 總是收到錯誤(SQLSTATE:空,錯誤碼:0)。 – Sasa

+0

@AlenVrečko如果您打開日誌記錄,與調試水平集,它註銷已解析查詢了。我們做了我們的解析器與報表工具兼容的,因爲我們從0建立了一個ANTLR語法,它只是在從接受子查詢。 [例子可以在這裏找到(http://code.google.com/p/starschema-bigquery-jdbc/wiki/QueryTransformationEngine) –

19

2013更新:您可以使用SUM()OVER()計算運行總數。

在您的例子:

SELECT id, value, SUM(value) OVER(ORDER BY id) 
FROM [your.table] 

工作的示例:

SELECT word, word_count, SUM(word_count) OVER(ORDER BY word) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' LIMIT 30; 
+0

這實際上可能是在金融蒙特非常有用卡洛模擬,我們需要累積小隨機偏差的總和來模擬價格路徑。 – Paul

+0

該語法也適用於標準SQL。請參閱關於分析功能的文檔。 https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions –