Re: join group by etc

From: "Obe, Regina" <robe(dot)dnd(at)cityofboston(dot)gov>
To: "Peter Jackson" <tasmaniac(at)iprimus(dot)com(dot)au>, "pgsql" <pgsql-novice(at)postgresql(dot)org>
Subject: Re: join group by etc
Date: 2008-08-11 13:09:14
Message-ID: 53F9CF533E1AA14EA1F8C5C08ABC08D204889DB1@ZDND.DND.boston.cob
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

Peter,

Well at least the below you have is more generic and will work for MySQL
and pretty much any relational database I can think of. I guess the
only issue is that if you use Max you are mixing records (since it
returns the max value for each field not the last record value). This
may be fine for your purposes, but something to think about.

FWIW: There is an easy way to get around the ordering issue of DISTINCT
ON and that is to wrap it in a subselect

SELECT * FROM
(SELECT DISTINCT ON(T1.iId) T1.*, T2.ttC, T3.tthD, toD as sort

FROM table_one T1 INNER JOIN

table_two T2 ON T1.iId = T2.iId INNER JOIN table_three T3 ON T3.fId =

T2.fId WHERE T1.tId = '9' and T1.toC = 'o'

ORDER BY T1.iId, toD) As result
ORDER BY sort;

Hope that helps,
Regina

-----Original Message-----
From: pgsql-novice-owner(at)postgresql(dot)org
[mailto:pgsql-novice-owner(at)postgresql(dot)org] On Behalf Of Peter Jackson
Sent: Saturday, August 09, 2008 2:42 AM
To: pgsql
Subject: Re: [NOVICE] join group by etc

Ok just a bit more info. Unfortunately DISTINCT ON didnt work after all
(once I started to get some more data into the tables and try different
sorts. Ended up having to select all fields and just use max(field1)
etc.
The reason I required this (which I didnt realise at the time) is that

the gui output can be sorted however you like. (and as DISTINCT ON
requires the field to be used as the first sort field it didnt work once

you decided to sort by anything but T1.iTd

The eventual output is:
T1.tOc T2.fId(24) T2.fId(25) T2.fId(26) T2.fId(27) T1.tOd
which when you click on the row brings up the rest of the record.

so whatever records that relate to t1.tId (which could be 4 or 400) are
displayed so the final outcome was

SELECT T1.iId,max(T1.tId),max(T1.toC) as status,max(T1.toD),max(T1.toE),

max(T2.ttC), max(T3.tthD), max(T1.toD) as sort FROM table_one T1 INNER
JOIN
table_two T2 ON T1.iId = T2.iId INNER JOIN table_three T3 ON T3.fId =
T2.fId WHERE T1.tId = '9' and T1.toC = 'o' GROUP BY T1.iId ORDER BY sort

Think I have explained that right. Anyway thanks for you help everyone.

-----------------------------------------
The substance of this message, including any attachments, may be
confidential, legally privileged and/or exempt from disclosure
pursuant to Massachusetts law. It is intended
solely for the addressee. If you received this in error, please
contact the sender and delete the material from any computer.

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message JORGE MALDONADO 2008-08-13 19:03:56 COPYING A DATABASE TO ANOTHER TABLESPACE
Previous Message Selvakaruppiah s-TLS,Chennai 2008-08-11 05:25:59 Problem with Postgres 8.1.4