1

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

表 1

ID    MAX    AMT  SORTED
1     20     0    1
1     30     0    2
1     40     0    3
1     50     0    4
2     0      0    1
2     30     0    2
2     40     0    3
2     40     0    4
...

表2

ID    AMT
1     75
2     70
...

我必须Table1.AMT使用Table2.AMT此规则进行更新:

  1. Table1Table2加入ID
  2. Table1.AMT不能持有大于MAX
  3. if Table2.AMT >= Table1.MAXthen Table1.AMT = Table1.MAX... 然后在下一行更新Table1.AMTTable2.AMT - previous record 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
...

怎么能做到这一点?

我想创建一个聚合SUM()的临时表Table1.MAX,并将其用作更新的引用Table1.AMT(如果则为SUM(MAX) < Table2.AMT其他Table1.AMT = Table1.MAXTable1.AMT = previous records SUM(MAX)

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

4

1 回答 1

1

使用细节或 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 

计算AMT的解释:

AMT 是“MAX for the row”“How much is possible”中最小的

least(min(t1.MAX),"How much is possible")

“有多少可能”:最大可用 - 为前几行提供了多少 + 我们已经拥有了多少

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)
于 2012-08-24T17:28:45.957 回答