sql - 未定义行数的计算

标签 sql google-bigquery dbt

我想添加一个计算,考虑到我们可能有一行、两行、三行或更多行。我们可以使用关系获取所有数据,但我有点卡住了,因为关系的数量未定义。 例如,作为来源:

SELECT 123 AS id
      ,250 AS amount
      ,225 AS debt
      ,NULL AS relation
      ,1 AS rn
UNION ALL    
SELECT 124 AS id
      ,150 AS amount
      ,25 AS debt
      ,123 AS relation
      ,2 AS rn
UNION ALL   
SELECT 125 AS id
      ,160 AS amount
      ,50.25 AS debt
      ,124 AS relation
      ,3 AS rn
UNION ALL
SELECT 126 AS id
      ,80 AS amount
      ,25 AS debt
      ,125 AS relation
      ,4 AS rn 

源表

<表类=“s-表”> <标题> id 金额 债务 关系 rn <正文> 123 250 225 空 1 124 150 25 123 2 125 160 50.25 124 3 126 80 25 125 4

茶几

<表类=“s-表”> <标题> id 金额 债务 关系 rn 卡路里 <正文> 123 250 225 空 1 250 124 150 25 123 2 22.5 125 160 50.25 124 3 7.5375 126 80 25 125 4 3.75

我需要应用如下计算:

  • 第 1 行:金额
  • 第 2 行:row2.debt*row1.debt/row1.金额
  • 第 3 行:row3.debt*row2.debt/row2.amount*row1.debt/row1.amount
  • 第 4 行:row4.debt*row3.debt/row3.debt*row2.debt/row2.amount*row1.debt/row1.amount
  • 等等..

我正在使用 dbt,但很高兴听到有关 BigQuery 或其他 SQL 的信息,因为我真的很好奇如何做到这一点。

最佳答案

一点数学知识可以帮助你 - 见下文

select *,
  ifnull(
    round(exp(sum(ln(debt)) over(order by id rows between unbounded preceding and current row))
    / exp(sum(ln(amount)) over(order by id rows between unbounded preceding and 1 preceding)), 2),
    amount
  ) cal
from `project.dataset.table`  

如果应用于问题中的示例数据 - 输出为

enter image description here

注意:我使用 order by id 假设 id 列定义了行的顺序。您可以根据需要进行调整

关于sql - 未定义行数的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66456863/

相关文章:

sql - SQL 中的复杂外键约束

sql - MySQL 8 中不完整的执行计划

snowflake-cloud-data-platform - 从外部源查询 dbt

mysql - "Unknown column"连接查询中的错误旨在选择感兴趣的组中的单个行

sql-server - 如何将 SELECT 和 INSERT 命令组合到 SQL Server 中不存在的表中?

sql - BigQuery 替换了我的大部分 Spark 作业,我是否遗漏了什么?

databricks - 无法将 dbt 连接到 Databricks

sql - DBT 完全刷新会删除我所有的物化 View 。 Postgres

mysql - 根据另一个表中的 ID 和日期过滤 bigquery 表

google-bigquery - 带循环的 BigQuery UDF