Bigquery:在 Bigquery 中计算余额或重写 SQL 脚本

Posted

技术标签:

【中文标题】Bigquery:在 Bigquery 中计算余额或重写 SQL 脚本【英文标题】:Bigquery: Calculate balance or rewrite SQL script in Bigquery 【发布时间】:2021-12-24 15:59:17 【问题描述】:

请帮忙。我正在尝试找到一个解决方案,如何通过在 BigQuery 中使用“in”和“out”以及以前的余额来计算每一行的当前余额: '当前余额'= '以前的余额'+ 'in' - 'out'

我有:

| id | in |out|
| ---| ---|---|
|1   | 10 |0  |
|2   | 30 |5  |
|3   | 0  |1  |

预期结果:

| id| in|out| Balance |
|---|---|---|---------|
|1  | 10|  0|       10|
|2  | 30|  5|       35|
|3  | 0 |  1|       34|

这里提出了同样的问题:[https://***.com/questions/9394418/calculate-balance-with-mysql][1],但提供的解决方案适用于 MySQL。

如果有办法将其传输到 BigQuery:

SELECT 
    `table`.`ID`,
    `table`.`In`,
    `table`.`Out`,
    @Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC

或者还有其他选项可以计算 BigQuery 中的余额吗?

谢谢!

【问题讨论】:

【参考方案1】:

考虑以下方法

select * except(initial_balance), 
  initial_balance + sum(t.in - t.out) over win as balance
from your_table t,
unnest([struct(0 as initial_balance)])
window win as (order by id)

如果应用于您问题中的样本数据并且初始余额 = 0 - 输出为

【讨论】:

【参考方案2】:

试试这个

SELECT SUM(IN) OVER(ORDER BY ID) - SUM(OUT) OVER (ORDER BY ID) 
FROM YOUR_TABLE

【讨论】:

谢谢!有什么办法可以添加初始余额? tge intial bal 是否存储在变量中

以上是关于Bigquery:在 Bigquery 中计算余额或重写 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中计算百分位数

在 BigQuery 中计算不同的 concat

在 BigQuery 中计算当前用户返回率

计算不同行的总和并保存在单行 BigQuery 中

是否可以在数据洞察计算中使用 BigQuery 重复字段?

在 bigquery 中计算 7、14 和 30 天移动平均线