13

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で機能させる方法が見つかりませんでした...

4

4 に答える 4

35

2018年の更新:元の質問のクエリは変更なしで機能するようになりました。

#standardSQL
WITH RunTotalTestData AS (
  SELECT * FROM UNNEST([STRUCT(1 AS id, 1 AS value),(2,0),(3,1),(4,1),(5,2),(6,3)]) 
)

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

ここに画像の説明を入力してください

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;
于 2013-12-09T21:08:39.200 に答える
4

あなたはおそらくそれをすでに理解しているでしょう。しかし、これが1つの方法であり、最も効率的な方法ではありません。

JOINは、等式比較を使用してのみ実行できます。iebid<=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

それに参加します。

請求が進むにつれて、結合テーブルは処理でカウントされます。

于 2013-02-05T23:43:59.977 に答える
1

問題は2番目のクエリにあり、BigQueryはFROM式の2つのテーブルをUNIONします。

最初のものについてはよくわかりませんが、bigqueryがSelect式での副選択を嫌い、FromExpressionでのみ嫌いである可能性があります。したがって、サブクエリをfromexpressionに移動し、結果を結合する必要があります。

また、JDBCドライバーを試してみることができます: Starschema BigQuery JDBC Driver

Squirrel SQL、RazorSQL、またはJDBCドライバーをサポートするツールにロードするだけで、次のように設定してQueryTransformerをオンにしてください。

transformQuery = true

プロパティまたはJDBCURLには、すべての情報がプロジェクトページにあります。これを行った後、2番目のクエリを実行してみてください。これは、BigQuery互換の結合に変換されます。

于 2013-02-03T10:31:09.387 に答える
0

窓関数の使用を許可すれば簡単です。

https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts

それで私たちはこのようにそれを行うことができます:

WITH RunTotalTestData AS (
  SELECT * FROM UNNEST([STRUCT(1 AS id, 1 AS value),(2,0),(3,1),(4,1),(5,2),(6,3)]) 
)

select *, sum(value) over(order by id) as running_total
from RunTotalTestData

ここに画像の説明を入力してください

于 2022-01-25T09:50:04.203 に答える