a SQL query question
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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
aid pid nmol
- --- --- ----
1 23 34
3 23 100
2 45 3445
5 45 14
6 45 200
4 78 12
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
- -------------------------------------------------------------------
Rajarshi Guha <rguha@indiana.edu>
GPG Fingerprint: D070 5427 CC5B 7938 929C DD13 66A1 922C 51E7 9E84
- -------------------------------------------------------------------
"whois awk?", sed Grep.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEARECAAYFAkiOfd4ACgkQZqGSLFHnnoSOKACguioqdY0/Ut7su2KUYu+IRP7D
xOUAoKZsQKveWM52RTe422i3SRGWZk2u
=Xs+n
-----END PGP SIGNATURE-----
Rajarshi Guha wrote:
What I'm trying to do is to select those rows where pid is not null,
grouped by pid.From within each group I'd like to select the row that has the
maximum value of nmol.
Distinct on should do the job for you.
select distinct on (pid) aid, pid, nmol
from atable
where pid is not null
order by pid, nmol desc
If you want the rows tie for max nmol within a pid then you can go to
select aid,pid,nmol
from atable
where (pid,nmol) in (select pid, max(nmol) from atable where pid is
not null group by pid)
klint.
--
Klint Gore
Database Manager
Sheep CRC
A.G.B.U.
University of New England
Armidale NSW 2350
Ph: 02 6773 3789
Fax: 02 6773 3266
EMail: kgore4@une.edu.au
Rajarshi Guha wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1Hi, 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 nullIn 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 followingaid pid nmol
- --- --- ----
1 23 34
3 23 100
2 45 3445
5 45 14
6 45 200
4 78 12From within each group I'd like to select the row that has the maximum
value of nmol. So I'd end up withaid pid nmol
- --- --- ----
3 23 100
2 45 3445
4 78 12I can easily do the first step, but am struggling to make the SQL for
the second step. Any pointers would be appreciated
This should do it:
SELECT DISTINCT ON (pid) aid, pid, nmol
FROM foobar
WHERE pid IS NOT NULL
ORDER BY pid ASC, nmol DESC;
The pid ASC satisfies the requirement for the DISTINCT ON part, while
the nmol DESC ensures we get the MAX from each group. Or something like
that.
brian
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 nullIn 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 followingFrom within each group I'd like to select the row that has the
maximum value of nmol. So I'd end up withaid pid nmol
- --- --- ----
3 23 100
2 45 3445
4 78 12I 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
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Jul 28, 2008, at 10:18 PM, Rajarshi Guha wrote:
aid pid nmol
- --- --- ----
3 23 100
2 45 3445
4 78 12I can easily do the first step, but am struggling to make the SQL
for the second step. Any pointers would be appreciated
Thanks to the posters for helpful solutions
- -------------------------------------------------------------------
Rajarshi Guha <rguha@indiana.edu>
GPG Fingerprint: D070 5427 CC5B 7938 929C DD13 66A1 922C 51E7 9E84
- -------------------------------------------------------------------
Alcohol, an alternative to your self
- 'Alcohol' by the Bare Naked Ladies
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEARECAAYFAkiOnG8ACgkQZqGSLFHnnoR2qQCeMntkTpqR/ZaVS/nY1izO5u5y
0FYAn0dwi8v0jSB4OvK4OnwMr+7ypQPp
=pNGY
-----END PGP SIGNATURE-----