From: | Tino Wildenhain <tino(at)wildenhain(dot)de> |
---|---|
To: | John Gibson <gib(at)edgate(dot)com> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Storing Snapshot Data |
Date: | 2003-12-11 15:11:17 |
Message-ID: | 3FD88915.1040703@wildenhain.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi John,
John Gibson schrieb:
> Hi, all.
>
> I have a table which is continually updated with the latest totals. I
> would like to take snapshots of some of the data in that table and store
> it in a second table to run statistics on it later. What might some
> ways of doing this be?
>
> Illustrative (I hope) example using fruit-qty-on-hand at a grocery store:
>
> Fruit_table {constantly updated by other processes}
>
> CREATE TABLE "fruit_table" (
> "fruit_name" varchar(20),
> "fruit_qty" int4
> );
>
>
> ***TABLE DATA***
> fruit name fruit_qty
> apple 5
> orange 8
> pear 3
>
>
>
> monitor_table {stores snapshots of fruit table from time to time}
>
> CREATE TABLE "monitor_table" (
> "monitor_time" timestamp,
> "mon_apples_qty" int4,
> "mon_oranges_qty" int4,
> "mon_pears_qty" int4
> );
>
>
> I got the following to timestamp a single row from the fruit_table and
> put the results into the monitor_table:
>
> insert into monitor_table(monitor_time, mon_apples_qty)
> select now(), fruit_table.fruit_qty
> where fruit_name = 'apple';
>
> Unfortunately, I am stuck on how to get all three into the monitor table
> with the same timestamp. Since the times will be relatively long
> between snapshots some type of variables or functions could be used (I
> guess) to store the current time ( curr_time := now(); ) and then run
> the query three times with first an insert and then two updates using
> the variable time stamp on the updates to locate the record to update.
Id use a third table to just store the snapshot times and a sequence
number:
CREATE SEQUENCE monitor_snapshots_id_seq;
CREATE TABLE monitor_snapshots (
monitor_time timestamp,
monitor_id int8 DEFAULT nextval('monitor_snapshots_id_seq'::text)
NOT NULL
);
and then use the following code to take your snapshots:
INSERT INTO monitor_snapshots (monitor_time) VALUES (now());
INSERT INTO monitor_table
SELECT currval('monitor_snapshots_id_seq'::text) as monitor_id,
fruit_name,
fruit_qty
FROM fruit_table;
Provided you modify your monitor_table
to have monitor_id, fruit_name (perhaps fruit_id is better here),
fruit_qty
If you got a table with fruit_id:fruit_name, you can always retrive
your information via LEFT OUTER JOIN, otherwise you would only get
the kind of fruits available in the given snapshot.
HTH
Tino Wildenhain
From | Date | Subject | |
---|---|---|---|
Next Message | Manfred Koizar | 2003-12-11 15:14:43 | Re: [GENERAL] Transaction Question |
Previous Message | John Isaacks | 2003-12-11 15:03:40 | Re: Making a tree with "millions and millions" of dynamic nodes |