Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将上一行的值传递给当前行?_Sql_Database_Oracle - Fatal编程技术网

Sql 如何将上一行的值传递给当前行?

Sql 如何将上一行的值传递给当前行?,sql,database,oracle,Sql,Database,Oracle,如何将前一行的结果传递给当前行的计算 考虑到单位和成本,我需要得到每笔交易的平均成本: 公式如下: 平均成本是交易成本的总和 如果类型为Sub,则Trx成本等于成本 如果类型为红色,则Trx成本为单位*(先前Trx成本之和/先前单位之和) |行|类型|单位|成本| TrxCost |平均成本| |1 | Sub | 0.2 | 1000 | 1000 | 1000| |2 | Sub | 0.3 | 2500 | 2500 | 3500| |3 | Sub | 0.1 | 600 | 600 |

如何将前一行的结果传递给当前行的计算

考虑到单位和成本,我需要得到每笔交易的平均成本:

公式如下:

  • 平均成本是交易成本的总和
  • 如果类型为Sub,则Trx成本等于成本
  • 如果类型为红色,则Trx成本为单位*(先前Trx成本之和/先前单位之和)
  • |行|类型|单位|成本| TrxCost |平均成本| |1 | Sub | 0.2 | 1000 | 1000 | 1000| |2 | Sub | 0.3 | 2500 | 2500 | 3500| |3 | Sub | 0.1 | 600 | 600 | 4100| |4 |红色|-0.2 |-1100 |-1366.67 | 2733.33| |5 | Sub | 0.3 | 1000 | 1000 | 3733.33| |6 |红色|-0.6 |-600 |-3200 | 533.33| 更新:

    订单以行号为基础

    谢谢。

    请参阅,它允许您访问结果集中其他行的值。在您的情况下,您需要告诉我们更多关于何时停止查看的标准等:

    select
        lag(unit,1) over (partition by type order by whatever) 
      * lag(cost,1) over (partition by type order by whatever)
    from Trx
    
    但我仍然不知道您希望如何将交易和减少相互关联。一定有什么专栏你没告诉我们。如果该列(PartNumber?)已知,您可以简单地按该列分组和求和。

    请参阅,它允许您访问结果集中其他行的值。在您的情况下,您需要告诉我们更多关于何时停止查看的标准等:

    select
        lag(unit,1) over (partition by type order by whatever) 
      * lag(cost,1) over (partition by type order by whatever)
    from Trx
    

    但我仍然不知道您希望如何将交易和减少相互关联。一定有什么专栏你没告诉我们。如果该列(PartNumber?)已知,您可以简单地根据该列进行分组和求和。

    您可以使用递归CTE

    WITH cte (row_num,
         type,
         unit,
         sum_of_unit,
         cost,
         trxcost,
         ave_cost
    ) AS (
         SELECT row_num,
                type,
                unit,
                unit AS sum_of_unit,
                cost,
                cost AS trxcost,
                cost AS ave_cost
         FROM t
         WHERE row_num IN (
              SELECT MIN(row_num)
              FROM t
         )
         UNION ALL
         SELECT t.row_num,
                t.type,
                t.unit,
                c.sum_of_unit + t.unit AS sum_of_unit,
                t.cost,
                CASE t.type
                     WHEN 'Sub'   THEN t.cost
                     WHEN 'Red'   THEN t.unit * ( c.ave_cost / c.sum_of_unit )
                END
           AS trxcost,
                c.ave_cost + CASE t.type
                     WHEN 'Sub'   THEN t.cost
                     WHEN 'Red'   THEN t.unit * ( c.ave_cost / c.sum_of_unit )
                END AS ave_cost
         FROM t
         JOIN cte c ON t.row_num = c.row_num + 1
    )
    SELECT * FROM cte
    

    您可以使用递归CTE

    WITH cte (row_num,
         type,
         unit,
         sum_of_unit,
         cost,
         trxcost,
         ave_cost
    ) AS (
         SELECT row_num,
                type,
                unit,
                unit AS sum_of_unit,
                cost,
                cost AS trxcost,
                cost AS ave_cost
         FROM t
         WHERE row_num IN (
              SELECT MIN(row_num)
              FROM t
         )
         UNION ALL
         SELECT t.row_num,
                t.type,
                t.unit,
                c.sum_of_unit + t.unit AS sum_of_unit,
                t.cost,
                CASE t.type
                     WHEN 'Sub'   THEN t.cost
                     WHEN 'Red'   THEN t.unit * ( c.ave_cost / c.sum_of_unit )
                END
           AS trxcost,
                c.ave_cost + CASE t.type
                     WHEN 'Sub'   THEN t.cost
                     WHEN 'Red'   THEN t.unit * ( c.ave_cost / c.sum_of_unit )
                END AS ave_cost
         FROM t
         JOIN cte c ON t.row_num = c.row_num + 1
    )
    SELECT * FROM cte
    

    您可以分两次完成此操作:一次获取
    成本,然后一次获取
    平均成本

    顺便说一句,你所说的“平均”是一个连续的总数;你只是在增加价值

    您需要在
    子句之间具有
    行的窗口函数。(如果(
    SUM(…)超过(ORDER BY…
    ),则这是在无界的前一个和当前之间的隐式

    我重命名了您的
    id
    ,因为
    是保留字

    最后一行的结果与您的不同。我用了你的公式,但得到了不同的数字


    Rextester演示:

    您可以通过两个步骤来完成此操作:一个是获取
    成本,另一个是获取
    平均成本

    顺便说一句,你所说的“平均”是一个连续的总数;你只是在增加价值

    您需要在
    子句之间具有
    行的窗口函数。(如果(
    SUM(…)超过(ORDER BY…
    ),则这是在无界的前一个和当前之间的隐式

    我重命名了您的
    id
    ,因为
    是保留字

    最后一行的结果与您的不同。我用了你的公式,但得到了不同的数字



    Rextester demo:

    我已经试过了,但我的问题是,我必须先计算前一行的平均成本,然后使用结果计算当前行的平均成本。我已经试过了,但我的问题是,我必须先计算前一行的平均成本,然后使用结果计算当前行的平均成本。哪个列标识哪一行是前一行?如果没有这个,你怎么知道哪一个是当前的,哪一个是前一个呢?我添加了行号。谢谢另外,当你说前几行的总和时,它是指成本的总和吗?trx成本的总和。谢谢提醒,最后一行的TrxCost=-3200是如何获得的?通过你的公式,我得到:-0.6*(1000+2500+600-1100+1000)/(0.2+0.3+0.1-0.2+0.3)=-3428.57哪一列标识哪一行是前一行?如果没有这个,你怎么知道哪一个是当前的,哪一个是前一个呢?我添加了行号。谢谢另外,当你说前几行的总和时,它是指成本的总和吗?trx成本的总和。谢谢提醒,最后一行的TrxCost=-3200是如何获得的?通过你的公式,我得到:-0.6*(1000+2500+600-1100+1000)/(0.2+0.3+0.1-0.2+0.3)=-3428.57Hi@kaushik-Nayak这太棒了。但没有给出trx成本和ave成本,需要先计算。只给出了单位和成本。@just10:这个解决方案已经考虑到了这一点。您应该看到更新的dbfiddle并使用此查询。很好!这真的很棒,但我会接受thorsten的回答,因为它的代码更短。希望您理解:)@just10:代码长度应该是您做出决定的最起码的标准。您应该检查这两种代码的性能,并使用最适合您的代码,重要的是,它应该为您提供正确的结果。我可以为您重新格式化代码并减少查询的行数,但这不是重点。但是,同样,你可以自由选择。我同意,查询的长度不应该触发决策。尤其是当查询结果不同时,就像我们的查询一样。我喜欢CTE方法。现在你的查询依赖于连续的行号,但是这些行号很容易生成。但没有给出trx成本和ave成本,需要先计算。只给出了单位和成本。@just10:这个解决方案已经考虑到了这一点。您应该看到更新的dbfiddle并使用此查询。很好!这真的很棒,但我会接受thorsten的回答,因为它的代码更短。希望您理解:)@just10:代码长度应该是您做出决定的最起码的标准。您应该检查这两种代码的性能,并使用最适合您的代码,重要的是,它应该为您提供正确的结果。我可以为您重新格式化代码并减少查询的行数,但这不是重点。但是,再一次,你可以自由选择