Problem with query on history table - Mailing list pgsql-sql

From Andreas Joseph Krogh
Subject Problem with query on history table
Date
Msg-id 200602270819.30702.andreak@officenet.no
Whole thread Raw
Responses Re: Problem with query on history table  ("Jim C. Nasby" <jnasby@pervasive.com>)
List pgsql-sql
Hi all!

I don't know if there's a standard solution to the kind of problem I'm trying 
to solve, but I will appreciate your thougts(and maybe solution:) on this 
problem of mine:

I have 2 tables: hist and curr which hold numbers for "history-data" and 
"current-data" respectivly. Here is a simplified version of the schema:

CREATE TABLE curr (   id integer NOT NULL,   etc integer NOT NULL,   created timestamp without time zone NOT NULL,
modifiedtimestamp without time zone
 
);

CREATE TABLE hist (   id serial NOT NULL,   curr_id integer NOT NULL REFERENCES curr(id),   etc integer NOT NULL,
modifiedtimestamp without time zone NOT NULL
 
);

andreak=# SELECT * from curr;id | etc |       created       |      modified
----+-----+---------------------+--------------------- 1 |   5 | 2006-02-01 00:00:00 | 2 |  10 | 2006-01-15 00:00:00 |
2006-01-2600:00:00 3 |  10 | 2006-01-08 00:00:00 | 2006-01-25 00:00:00
 
(3 rows)

andreak=# SELECT * from hist;id | curr_id | etc |      modified
----+--------+-----+--------------------- 1 |       3 |  30 | 2006-01-16 00:00:00 2 |       3 |  20 | 2006-01-25
00:00:003 |       2 |  20 | 2006-01-26 00:00:00
 
(3 rows)

Now - I would like to get a report on what the "ETC" is on a given entry in 
"curr" in a given "point in time". Let me explain. If I want status for 17. 
jan.(17.01.2006) I would like to get these numbers out from the query:
id |       created       |    curr_modified    |    hist_modified    | etc
----+---------------------+---------------------+---------------------+----- 3 | 2006-01-08 00:00:00 | 2006-01-25
00:00:00| 2006-01-16 00:00:00 |  30 2 | 2006-01-15 00:00:00 | 2006-01-26 00:00:00 | 2006-01-26 00:00:00 |  20 1 |
2006-02-0100:00:00 |                     |                     |   5
 


That is; If the entry is modified after it's created, a snapshot of the "old 
version" is copied to table "hist" with the hist.modified field set to the 
"modified-timestamp". So there will exist several entries in "hist" for each 
time an entry in "curr" is modified.

If I want status for the 27. jan. I would like the query to return the 
following rows:
id |       created       |    curr_modified    |    hist_modified    | etc
----+---------------------+---------------------+---------------------+----- 3 | 2006-01-08 00:00:00 | 2006-01-25
00:00:00| 2006-01-25 00:00:00 |  10 2 | 2006-01-15 00:00:00 | 2006-01-26 00:00:00 | 2006-01-26 00:00:00 |  10 1 |
2006-02-0100:00:00 |                     |                     |   5
 

select curr.id, curr.created, curr.modified as curr_modified, hist.modified as 
hist_modified, coalesce(hist.etc, curr.etc) as etc FROM curr LEFT OUTER JOIN 
hist ON(curr.id = hist.curr_id) WHERE ...

I'm really stuck here. It seems to me that I need a lot of 
CASE...WHEN...ELSE.. statements in the query, but is there an easier way?

--
Andreas Joseph Krogh <andreak@officenet.no>


pgsql-sql by date:

Previous
From: "Bath, David"
Date:
Subject: Dump/restore comments only?
Next
From: Ragnar
Date:
Subject: Re: Dump/restore comments only?