Thread: query syntax question

query syntax question

From
Lance Massey
Date:
I'm migrating from mySQL where my database tables have an "ID" column
and a an "ID_extended" column. This was done so I could keep a history
e.g. a customer gets an ID when signing on then if they move a new row
is inserted, keeping the old ID, but incrementing the extended ID.

I'm sure there's a better way, but I digress.

In mySQL I could select the most recent addresses with

"Select *, max(ID_extended) from customers group by ID"

In postgreSQL that apparently doesn't work.

If if do:
"Select ID, max(ID_extended) from customers group by ID"

I get a list of the the correct IDs and extended IDs - however, I can't
seem to structure a query where I also retrieve address info.

Is there a way to use the results of that query as inputs to another?
Or is there a better way to write the previous query? Or should I
re-think the data structure since postgreSQL has objects and arrays
available?...

thanks,

L


Re: query syntax question

From
Bruno Wolff III
Date:
On Fri, Apr 15, 2005 at 08:22:31 -0500,
  Lance Massey <lmspam@neuropop.com> wrote:
>
> In mySQL I could select the most recent addresses with
>
> "Select *, max(ID_extended) from customers group by ID"
>
> In postgreSQL that apparently doesn't work.

If you you can live with a Postgres specific solution you can use
the DISTINCT ON clause to do this.

SELECT DISTINCT ON (id) * FROM customers ORDER BY id, id_extended DESC;

There has been some talk making the changes needed to detect that the
grouping is on the primary key, but I dn't know if that will make it in 8.1.

Until then, the standard conforming solution looks like this.
SELECT a.*
  FROM customers AS a,
    (SELECT id, max(id_extended) FROM customers GROUP BY id) AS b
  WHERE a.id = b.id;

Note I didn't run this query, so there could be typos.