知道如何计算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
Run Code Online (Sandbox Code Playgroud)
使用相关标量查询的传统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;
Run Code Online (Sandbox Code Playgroud)
或加入:
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;
Run Code Online (Sandbox Code Playgroud)
但是我找不到让它在BigQuery中运行的方法......
Fel*_*ffa 29
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;
Run Code Online (Sandbox Code Playgroud)

2013更新:您可以使用SUM()OVER()来计算运行总计.
在你的例子中:
SELECT id, value, SUM(value) OVER(ORDER BY id)
FROM [your.table]
Run Code Online (Sandbox Code Playgroud)
一个工作的例子:
SELECT word, word_count, SUM(word_count) OVER(ORDER BY word)
FROM [publicdata:samples.shakespeare]
WHERE corpus = 'hamlet'
AND word > 'a' LIMIT 30;
Run Code Online (Sandbox Code Playgroud)
你可能已经明白了。但这是一种方法,但不是最有效的方法:
JOIN 只能使用相等比较来完成,不能使用 iebid <= 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
Run Code Online (Sandbox Code Playgroud)
您也可以手动限制时间:
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
Run Code Online (Sandbox Code Playgroud)
更新:
您不需要特殊的财产。你可以只使用
SELECT 1 AS one
Run Code Online (Sandbox Code Playgroud)
并加入其中。
随着计费的进行,连接表在处理中计数。
| 归档时间: |
|
| 查看次数: |
11525 次 |
| 最近记录: |