SQL将基于两列的值递减至0

SQL将基于两列的值递减至0,sql,oracle10g,aggregate-functions,windowing,Sql,Oracle10g,Aggregate Functions,Windowing,我有以下数据集(只是一个示例): 表1: 表2: 我必须使用以下规则从Table2.AMT更新Table1.AMT: Table1和Table2在ID 表1.金额不能大于最大值 如果Table2.AMT>=Table1.MAX那么Table1.AMT=Table1.MAX。。。然后在下一行更新Table1.AMT,其中Table2.AMT-上一记录AMT仍使用上述规则 因此,预期的产出将是 ID MAX AMT SORTED 1 20 20 1 1 30

我有以下数据集(只是一个示例):

表1:

表2:

我必须使用以下规则从
Table2.AMT
更新
Table1.AMT

  • Table1
    Table2
    ID
  • 表1.金额
    不能大于最大值
  • 如果
    Table2.AMT>=Table1.MAX
    那么
    Table1.AMT=Table1.MAX
    。。。然后在下一行更新
    Table1.AMT
    ,其中
    Table2.AMT-上一记录AMT
    仍使用上述规则
  • 因此,预期的产出将是

    ID    MAX    AMT  SORTED
    1     20     20   1
    1     30     30   2
    1     40     25   3
    1     50     0    4
    2     0      0    1
    2     30     30   2
    2     40     40   3
    2     40     0    4
    ...
    
    如何才能做到这一点

    我想用
    Table1.MAX
    的聚合
    SUM()
    创建一个临时表,并将其作为更新
    Table1.AMT
    的参考(如果
    SUM(MAX)
    Table1.AMT=Table1.MAX
    否则
    Table1.AMT=以前的记录SUM(MAX)


    但是如果没有临时表,它能完成吗?(遗憾的是,我无法在我的工作环境中创建函数和过程。)

    可以使用specifics或Oracle PL/SQL创建更高效的解决方案

    以下是一个通用解决方案:

    select t1.ID, min(t1.MAX) as MAX, least(min(t1.MAX),coalesce(min(t2.AMT),0)-coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0)+min(t1.AMT)) as AMT, t1.SORTED
    from Table1 t1
    left join Table2 t2 on t2.ID = t1.ID
    left join Table1 t1p on t1p.ID = t1.ID and t1p.SORTED < t1.SORTED
    group by t1.ID, t1.SORTED 
    order by t1.ID, t1.SORTED 
    
    “可能的数量”:最大可用数量-前几行的数量+我们已经拥有的数量

    coalesce(min(t2.AMT),0) - "how much was given for previous rows" + min(t1.AMT)
    
    “前几行给出了多少”:需要填充多少和可能填充多少的小数值

    coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0)
    

    可以使用specifics或oraclepl/SQL创建更高效的解决方案

    以下是一个通用解决方案:

    select t1.ID, min(t1.MAX) as MAX, least(min(t1.MAX),coalesce(min(t2.AMT),0)-coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0)+min(t1.AMT)) as AMT, t1.SORTED
    from Table1 t1
    left join Table2 t2 on t2.ID = t1.ID
    left join Table1 t1p on t1p.ID = t1.ID and t1p.SORTED < t1.SORTED
    group by t1.ID, t1.SORTED 
    order by t1.ID, t1.SORTED 
    
    “可能的数量”:最大可用数量-前几行的数量+我们已经拥有的数量

    coalesce(min(t2.AMT),0) - "how much was given for previous rows" + min(t1.AMT)
    
    “前几行给出了多少”:需要填充多少和可能填充多少的小数值

    coalesce(least(sum(t1p.MAX-t1p.AMT), min(t2.AMT)),0)
    

    在您提出
    SUM()
    函数之前,这个问题非常清楚。你的意思是第二条规则实际上是“Table1.AMT的值不能大于所有Table1.MAX值的总和”?或者“Table1.AMT不能容纳大于所有Table2.AMT值之和的值”?oracle 10g和Table 1.AMT不能大于其行的最大值。Table1 sum AMT必须=Table2 AMT在您提出
    sum()
    函数之前,这个问题非常清楚。你的意思是第二条规则实际上是“Table1.AMT的值不能大于所有Table1.MAX值的总和”?或者“Table1.AMT的值不能大于所有Table2.AMT值的总和”?oracle 10g和Table 1.AMT不能大于其最大行数。Table1 sum AMT必须=Table2 AMT感谢您的回答,我将在周一试一试。顺便说一句,“Imre”在爱沙尼亚是一个常见的名字?谢谢你的回答,我将在周一试一试。顺便说一句,“Imre”在爱沙尼亚是一个常见的名字?