I have the following datasets (just a sample):
Table1:
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
...
Table2:
ID AMT
1 75
2 70
...
I must update Table1.AMT from Table2.AMT using this rules:
Table1andTable2are joined onIDTable1.AMTcan’t hold larger value thanMAX- if
Table2.AMT >= Table1.MAXthenTable1.AMT = Table1.MAX… then on the next row updateTable1.AMTwithTable2.AMT - previous record AMTstill using the above rules.
So the expected output would be
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
...
How can one achieve that?
I thought of creating a temp table with an aggregated SUM() of Table1.MAX, and using that as a reference to update Table1.AMT (if SUM(MAX) < Table2.AMT then Table1.AMT = Table1.MAX else Table1.AMT = previous records SUM(MAX)).
But can it be done without a temp table? (Sadly I can’t create functions and procedures in my work env.)
More efficient solution can be made using specifics or Oracle PL/SQL.
Here is a generic solution:
explanation of calculating AMT:
AMT is smallest of “MAX for the row” and “How much is possible”
“How much is possible”: max available – how much was given for previous rows + how much we already have
“how much was given for previous rows”: smalles of how much required to fill and how much possible