BigQuery SQL运行总计

时间:2013-02-02 17:39:26

标签: 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 

使用相关标量查询的传统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中运行的方法......

3 个答案:

答案 0 :(得分: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;

enter image description here

2013 update:您可以使用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;

答案 1 :(得分:4)

你可能已经弄清楚了。但这是一种,而不是最有效的方式:

JOIN只能使用相等比较来完成,即b.id&lt; = a.id不能使用。

https://developers.google.com/bigquery/docs/query-reference#joins

如果你问我这很蹩脚。但有一项工作。只需对某些虚拟值使用相等比较来获取笛卡尔积,然后使用WHERE作为&lt; =。这是疯狂的次优。但如果你的桌子很小,那就可以了。

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

加入。

随着结算的进行,联接表会在处理中计算。

答案 2 :(得分:1)

问题在于第二个查询,BigQuery将UNION FROM表达式中的2个表。

我不确定第一个,但是bigquery可能不喜欢Select表达式的子选择,只有FromExpression。因此,您需要将子查询移动到fromexpression中,然后加入结果。

此外,您可以尝试我们的JDBC驱动程序: Starschema BigQuery JDBC Driver

只需将其加载到Squirrel SQL或RazorSQL或任何支持JDBC驱动程序的工具中,请确保通过设置启用查询转换器:

  

transformQuery =真

在属性或JDBC URL中,可以在项目页面找到每个信息。执行此操作后,尝试运行第二个查询,它将转换为与BigQuery兼容的连接。