13

知道如何在 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 中工作的方法......

4

4 回答 4

35

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 更新:您可以使用 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;
于 2013-12-09T21:08:39.200 回答
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

您也可以手动限制时间:

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

并加入其中。

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

于 2013-02-05T23:43:59.977 回答
1

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

我不确定第一个,但 bigquery 可能不喜欢 Select 表达式中的子选择,仅在 FromExpression 中。因此,您需要将子查询移动到 from 表达式中,并 JOIN 结果。

另外,您可以尝试一下我们的 JDBC 驱动程序: Starschema BigQuery JDBC 驱动程序

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

转换查询=真

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

于 2013-02-03T10:31:09.387 回答
0

如果我们允许使用窗口功能,这很容易。

https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts

有了它,我们可以这样做:

WITH RunTotalTestData AS (
  SELECT * FROM UNNEST([STRUCT(1 AS id, 1 AS value),(2,0),(3,1),(4,1),(5,2),(6,3)]) 
)

select *, sum(value) over(order by id) as running_total
from RunTotalTestData

在此处输入图像描述

于 2022-01-25T09:50:04.203 回答