Re: a SQL query question

From: "Adam Rich" <adam(dot)r(at)sbcglobal(dot)net>
To: "'Rajarshi Guha'" <rguha(at)indiana(dot)edu>, "'pgsql-general'" <pgsql-general(at)postgresql(dot)org>
Subject: Re: a SQL query question
Date: 2008-07-29 03:32:14
Message-ID: 048901c8f12b$b258f040$170ad0c0$@r@sbcglobal.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

>
> Hi, I have a table of the form
>
> aid pid nmol
> - --- --- ----
> 1 23 34
> 2 45 3445
> 3 23 100
> 4 78 12
> 5 45 14
> 6 45 200
> 7 null null
>
> In general, aid is unique, pid and nmol are non-unique.
>
> What I'm trying to do is to select those rows where pid is not null,
> grouped by pid. So I'd get the following
>
> From within each group I'd like to select the row that has the
> maximum value of nmol. So I'd end up with
>
> aid pid nmol
> - --- --- ----
> 3 23 100
> 2 45 3445
> 4 78 12
>
> I can easily do the first step, but am struggling to make the SQL for
> the second step. Any pointers would be appreciated
>

Normally this is a difficult sort of thing to do, but it's made easier
by a unique feature of Postgresql. Please try the following:

SELECT DISTINCT ON (pid) aid, pid, nmol
FROM tbl
WHERE pid IS NOT NULL
ORDER BY pid ASC, nmol DESC

More information can be found here:
http://www.postgresql.org/docs/8.3/interactive/sql-select.html#SQL-DISTINCT

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Lennin Caro 2008-07-29 03:35:21 Re: Clone a database to other machine
Previous Message brian 2008-07-29 03:23:23 Re: a SQL query question