2013-02-02 6 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

あなたは私に言わせればこれはかなりラメです。しかし、1つの回避策があります。いくつかのダミー値の等価比較を使用してデカルト積を求めてから、< =の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が2つのテーブルをFROM expressioで結合するという問題ですn。

私は最初のものについてはわかりませんが、bigqueryはSelectExpressionだけでSelect式の副選択を気に入らない可能性があります。したがって、サブクエリをfrom式に移動し、結果にJOINする必要があります。

また、あなたは私たちのJDBCドライバにそれを試してみることができます: Starschema BigQuery JDBC Driver

ただ単にあなたがクエリトランスをオンにする、ちょっとJDBCドライバをサポートする任意のツールをリスSQL、またはRazorSQLにロードしますか、設定によって:

プロパティでまたはJDBCのURLで

transformQuery =真

を、すべての情報は、プロジェクトのページで見つけることができます。これを実行した後、2番目のクエリを実行しようとすると、BigQuery互換の結合に変換されます。

+0

あなたはBigQueryのクエリの例を与えることができますか?サブセレクトをSELECTからFROMに移してBを参照する方法がわかりません。そして、あなたはJOIN ON <=できません。私は何が欠けていますか? –

+0

ヒントはありがたいですが、BQ jdbcドライバ(とSquirrelSQL)にはうんざりはありません。常にエラーが発生します(sqlState:null、errorCode:0)。 – Sasa

+0

@AlenVrečkoデバッグ時にレベルを設定してロギングをオンにすると、パーズド・クエリーもログアウトされます。我々はパーサーにレポーティングツールとの互換性を持たせました。なぜなら、0からANTLR文法を構築し、FROMでサブクエリしか受け入れないからです。 [例がここにあります](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 –