Query help - Mailing list pgsql-general

From Chuck Martin
Subject Query help
Date
Msg-id CAFw6=U06QsBOBLNyj1ZWz0rAENLXemsQtprsZHYfuD=HED8xag@mail.gmail.com
Whole thread Raw
Responses Re: Query help
Re: Query help
Re: Query help
List pgsql-general
I'm having trouble formulating a query. This is a simplified version of the tables:

ombcase
------------
case_pkey integer, primary key
casename varchar
insdatetime timestamp w/o time zone
status_fkey integer, foreign key

status
--------
status_pkey integer, primary key
statusid varchar

statuschange
--------
statuschange_pkey integer, primary key
insdatetime timestamp w/o time zone
ombcase_fkey integer, foreign key
oldstatus_fkey integer, foreign key
newstatus_fkey integer, foreign key
active integer, not nullable

The idea should be obvious, but to explain, insdatetime is set when a new record is created in any table. All records in ombcase have a foreign key to status that can't be null. When status changes, a record is created in statuschange recording the old and new status keys, and the time (etc). 

The goal is to find records in ombcase that have not had a status change in xx days. If the status has not changed, there will be no statuschange record. 

This query returns the age of each ombcase and the last statuschange record, but only if there is a statuschange record:

--Finds the age and last status change for open cases, but not age of cases with no status change

SELECT   casename, age(ombcase.insdatetime) AS caseage, age(laststatuschange.created_at) AS statusage

FROM 

(SELECT

case_fkey, MAX(insdatetime) AS created_at

FROM

statuschange

GROUP BY

case_fkey) AS laststatuschange

INNER JOIN

ombcase

ON

laststatuschange.case_fkey = case_pkey

RIGHT JOIN status

ON status_fkey = status_pkey

WHERE lower(statusid) NOT LIKE ('closed%')

AND case_pkey <> 0


I want to use coalesce (age(ombcase.insdatetime),age(statuschange.insdatetime) ) to return the time that a case has been in a status—or without a status change. But first I have to find the cases with no statuschange record. I was able to do that, too, using this query:


--find cases in status too long

SELECT  casename, coalesce (age(ombcase.insdatetime),age(statuschange.insdatetime) )

FROM ombcase

LEFT JOIN statuschange

ON case_fkey = case_pkey

LEFT JOIN status 

ON status_fkey = status_pkey

AND lower(statusid) NOT LIKE ('closed%')

AND coalesce ( age(ombcase.insdatetime), age(statuschange.insdatetime) ) > '2 months'


But this query will return all statuschange records for an ombcase record that has multiple ones. 


Any suggestions on how to combine the two ideas?


Chuck Martin
Avondale Software
--
Chuck Martin
Avondale Software

pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: RES: Postgresql Crasching
Next
From: Ron
Date:
Subject: Re: Query help