BigQuery SQL运行总计

Sas*_*asa 11 google-bigquery

知道如何计算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)


Ale*_*čko 4

你可能已经明白了。但这是一种方法,但不是最有效的方法:

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)

并加入其中。

随着计费的进行,连接表在处理中计数。