知道如何计算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中运行的方法......
答案 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;
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兼容的连接。