aktualisieren Sie ein Feld basierend auf Zwischensumme aus einer anderen Tabelle
-
22-07-2019 - |
Frage
Ich bin mit Oracle (10).
Ich habe zwei Tabellen bekam wie folgt:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
ist Table2 viele der mit einem zu Tabelle 1 über ID verbunden ist.
Was ich brauche, ist update-ing Table1.DATE mit: die letzten (frühesten) stammt aus Tabelle 2, wo Table1.AMOUNT - SUM (Table2.AMOUNT1) <= 0, wenn Tabellenstand 2 nach hinten durch das Feld Table2.DATE.
Gibt es eine einfache Möglichkeit, es zu tun?
Vielen Dank im Voraus!
UPDATE: , wie ich aus Ihren Antworten sehen hatte ich die Frage ein wenig falsch angegeben. So, hier geht ein ausführliches Beispiel:
Tabelle 1 hat:
ID: 1 AMOUNT:100 DATE:NULL
Table2 hat (für ID: 1 so ID ist nicht hier aufgelistet):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
Also in diesem Fall muß ich 20080111
als DATE in Tabelle 1 als 50 + 30 + 25 => 100.
Lösung
Auf der Basis Ihrer revised Frage, dies ist ein Fall für analytische Funktionen verwendet wird.
Angenommen, Sie gemeint> = 100 statt <= 100 als Beispiel impliziert und Umbenennen von Spalten hinzugefügt bis theDate seit DATE ein reserviertes Wort in Oracle ist:
update table1 set thedate=
( select max(thedate) from
( select id, thedate,
sum(amount1) over (partition by id order by thedate desc) cumsum
from table2
) v
where v.cumsum >= 100
and v.id = table1.id
)
Wenn die 100 den aktuellen Wert von table1 bedeutet dann diese Zeile ändern:
where v.cumsum >= table1.amount
Andere Tipps
Als erstes - Ihr Datenbank-Layout stark falsch anfühlt, aber ich denke, man kann nicht / nicht, es zu ändern. Table1
soll wohl eine Ansicht sein, und Table2
macht nicht den Eindruck der richtigen Normalisierung. So etwas wie (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
würde viel mehr Sinn für mich.
Aber Ihr Problem zu lösen (das ist T-SQL "UPDATE FROM
" Syntax, aber ich glaube, Oracle weiß es):
UPDATE
Table1
SET
Date = Table2Aggregate.MinDate
FROM
Table1
INNER JOIN (
SELECT Id, SUM(Amount1) SumAmount1, MIN(Date) MinDate
FROM Table2
GROUP BY Id
) AS Table2Aggregate ON Table1.Id = Table2Aggregate.ID
WHERE
Table1.Amount - Table2Aggregate.SumAmount1 <= 0