Aggregate Table

Hallo Leute,

bin neu hier und hoffe das ich nicht unnötig ein neues Thema eröffnet habe…

Also folgendes Problem,ich hab eine Aggregrate Table welche Attribute wie scraddr,dstaddr,wie auch transferierte bytes enthält.
Nun will ich neue Daten hinzufügen,welche die gleichen Attribute enthält,jedoch sollen gleiche source address und destination address zusammengefasst werden und die bytes sollen dann entsprechend aufsummiert werden.

Wie könnte man die Tabelle dynamisch updaten ,d.h. ein Update des Tables geschickt hinbekommen sobald man ein neuen child table importiert hat.
Ich weiss allerdings nicht, ob der Update-SQL-Befehl ausreicht, da z.T. ja auch neue Tupel in die Aggregate-Tabelle geschrieben werden müssen.

Bin ein wenig hilflos und würde mich über jede Hilfe freuen.

MfG

S.

Du suchst wohl Transaktionen, Locks und das ganze zusammengefasst in Stored Procedures.

Allerdings habe ich nicht genau verstanden was du erreichen möchtest. Vielleicht gibst du uns mal das ein oder andere Beispiel?

Vermutlich suchst Du PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Control Structures . Die Anpassung des UPDATE-Befehles dort überlasse ich Dir zur Übung, evtl. könnte/sollte man auch noch ein SELECT FOR UPDATE einbauen.

Andreas

@akretschmar Danke erstmal…

Hab mir mal die Funktion aus der Doku angeschaut,aber nicht auf mein Problem anpassen können.
Ich weiss nicht wie ich eine select anweisung nach dem set einbauen könnte.
Das ist aber erforderlich um auf alle Datensätze der neuen Tabelle, die schon in der Summary_table vorhanden sind ein update durchzuführen (bzw zu aggregieren).
Ausserdem habe ich da bedenken.Wenn meine neue table 500000 Einträge hat ,bei welchen teilweise ein update durchgeführt wird und bei den anderen ein insert, bekomme ich doch ziemlich sicher eine Exception oder?

@ads

also das Problem ist ein bisschen vereinfacht so zu verstehen:

ich hab eine old_table :

srcip dstip value
a b 10
c d 20
b a 5
a b 5

welche mit einem Befehl wie :
create table “summary” as
( select srcip,dstip , sum(value)as value from
“old_table” group by srcip,dstip);

zu
srcip dstip value
a b 15
c d 20
b a 5

wird.

Dann bekomme ich stündlich neue Tabellen hinzu die,die gleiche Form und auf die ich ebenfalls ein group by ausführe.
Eine “summary_new” table würde dann z.B. folgendermaßen aussehen:

srcip dstip value
g f 40
a b 8
c d 20
b a 11
h i 2

Wobei man davon ausgehen kann das die summary tabelle mit der zeit riesig wird.

Nun sollen summary wie auch die stündlichen summary_new Tabellen zusammengeführt werden und in unserem Fall eine solche Form bekommen:

srcip dstip value
a b 23
c d 40
b a 16
g f 40
h i 2

Das einzige was mir dazu einfällt ist zwischen summary und summary_new ein intersect auszuführen um ein Update zu erhalten und ein EXCEPT um ein Insert zu erhalten.
Also soetwas ähnliches,was aber leider nicht funktioniert:

UPDATE summary set SELECT * FROM summary_new INTERSECT SELECT * FROM summary

Aber ich weiss nicht wie ich die Idee mit einem Postgres- Befehl umsetzen könnte und ob die Idee irgendetwas taugt.


Grüße

Sophie

Anwendung des Beispiels aus der Doku:

test=# select * from sophie;
 src | dest | bytes         
-----+------+-------
   1 |    1 |    30
   1 |    2 |    20
   1 |    3 |    70
(3 rows)

test=*# select * from sophie_insert ;
 src | dest | bytes
-----+------+-------
   1 |    1 |    10
   1 |    1 |    20
   1 |    2 |    20
   1 |    3 |    20
   1 |    3 |    50
   1 |    4 |   100
(6 rows)

test=*# create or replace function sophie_agg(in in_src int,in in_dest int,in in_bytes int) returns text as $$ begin loop update sophie set bytes=bytes+in_bytes where src=in_src anddest=in_dest; if found then return 'update'; end if; begin insert into sophie (src, dest, bytes) values (in_src, in_dest, in_bytes); return 'insert'; exception when unique_violationthen end; end loop; end; $$ language plpgsql;
CREATE FUNCTION
test=*# select sophie_agg(src, dest, bytes) from sophie_insert ;
 sophie_agg
------------
 update
 update
 update
 update
 update
 insert
(6 rows)

test=*# select * from sophie;
 src | dest | bytes
-----+------+-------
   1 |    1 |    60
   1 |    2 |    40
   1 |    3 |   140
   1 |    4 |   100
(4 rows)

test=*#

Andreas

danke funktioniert wunderbar!! :slight_smile: :slight_smile: :slight_smile: