Re: efficient count/join query

From: Gary Stainburn <gary(dot)stainburn(at)ringways(dot)co(dot)uk>
To: Tomasz Myrta <jasiek(at)klaster(dot)net>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: efficient count/join query
Date: 2003-02-07 12:09:55
Message-ID: 200302071209.55330.gary.stainburn@ringways.co.uk
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

On Friday 07 Feb 2003 10:48 am, Tomasz Myrta wrote:
> Gary Stainburn wrote:
> > Hi folks,
> >
> > I've got two tables, first a history table containing tallies for
> > staff/jobs prior to going live, and second a roster table showing date,
> > diagram, job with one record per person per job per day. the tables are:
> >
> > create table history (
> > hsid int4 not null references staff(sid),
> > hjid int4 not null references jobs(jid),
> > hcount int4,
> > primary key (hsid,hjid));
> >
> > create table roster (
> > rodate date not null,
> > rogid int4 not null references diagrams(gid),
> > rojid int4 not null references jobs(jid),
> > rosid int4 references staff(sid),
> > primary key (rodate, rogid, rojid));
> >
> > What's the best/quickest/cheapest way to create a view in the format of
> > the history table but including the details from the roster table for all
> > records prior to today.
> >
> > I've been looking at some form of sub-select/join scheme but as some will
> > only exist on the history and some will only exist on the roster while
> > many will exist on both.
>
> Hello again.
>
> What if they exists in both tables - you need only one row result?
> If yes, you should use FULL OUTER JOIN and COALESCE.
>
> select
> coalesce(hjid,rjid) as jid,
> coalesce(hsid,rsid) as sid,
> hcount,
> rodate,
> rogid
> from
> history
> full outer join roster on (hjid=rjid and hsid=rosid)
>
> Using other names for the same field in other tables comes again -
> If you have the same name for jid and sid, you wouldn't need coalesce.
>
> Regards,
> Tomasz Myrta

Hi Tomasz,

I don't think you understand what I mean.

The history table could be thought of as the following SQL statement if the
data had actually existed. This table actually represents a manually input
summary of the pre-computerised data.

insert into history
select rosid, rojid, count(*) from roster_staff group by rssid, rsgsid;

If I have a history of

hsid | hjid | hcount
------+------+--------
1 | 2 | 3
1 | 3 | 1
5 | 5 | 4
6 | 5 | 3
9 | 4 | 4
14 | 5 | 4

and I have a roster of

rodate | rogid | rojid | rosid
-----------+-------+-------+-------
2003-02-15 | 1 | 2 | 1
2003-02-15 | 1 | 5 | 5
2003-02-16 | 1 | 5 | 1

I want my view to show

hsid | hjid | hcount
------+------+--------
1 | 2 | 4
1 | 3 | 1
1 | 5 | 1
5 | 5 | 5
6 | 5 | 3
9 | 4 | 4
14 | 5 | 4

--
Gary Stainburn

This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Gary Stainburn 2003-02-07 12:57:47 Re: efficient count/join query
Previous Message Achilleus Mantzios 2003-02-07 12:00:29 Re: automatic time/user stamp - rule or trigger?