SQL将基于两列的值递减至0
我有以下数据集(只是一个示例): 表1: 表2: 我必须使用以下规则从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
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”在爱沙尼亚是一个常见的名字?