【问题标题】:calculation with undefined number of rows未定义行数的计算
【发布时间】:2021-06-02 00:40:09
【问题描述】:

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

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 

源表

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

茶几

id amount debt relation rn cal
123 250 225 NULL 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.amount
  • 第 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 的信息,因为我真的很好奇如何做到这一点。

【问题讨论】:

    标签: sql google-bigquery dbt


    【解决方案1】:

    这里有一点数学可以帮助 - 见下文

    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`  
    

    如果应用于您问题中的样本数据 - 输出是

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

    【讨论】:

    • 嗨,我一直在测试无限前 (...) 之间的行,这真的很有趣。我知道我可以在其他地方使用它。我能知道为什么没有 EXP 和 LN 函数这不起作用吗?我试图理解这一点,因为场景比我发布的要深一些,我想看看我是否能解决它。我也有 0 和负值,我在文档中看到 LN 不适用于它们。谢谢
    • Can I know why this doesn't work without the EXP and LN functions? - 当然。 LN 允许您将乘法(设置窗口内的行中的值)转换为这些值的总和 - LN(v1 * v2 * ... * vN) = LN(v1)+LN(v2)+...+LN( vN)。然后 - 使用 EXP 给你实际的乘法结果 - EXP(LN(v1*v2*... *vN)) = v1*v2*... *vN. - 这就是你的计算公式:o)
    猜你喜欢
    • 2014-07-03
    • 2016-06-16
    • 2020-08-28
    • 2021-07-17
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2020-08-11
    相关资源
    最近更新 更多