2013-02-02 91 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 –