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. Table1そしてTable2参加していますID
  2. Table1.AMTより大きい値を保持することはできませんMAX
  3. if Table2.AMT >= Table1.MAXthen ... その後、上記のルールを引き続き使用しTable1.AMT = Table1.MAXて次の行を更新Table1.AMTします。Table2.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( if SUM(MAX) < Table2.AMTthen Table1.AMT = Table1.MAXelse Table1.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」「どれだけ可能か」の最小値です。

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 に答える