Re: Top n queries and GROUP BY

From: Rich Cullingford <rculling(at)sysd(dot)com>
To: Rich Cullingford <rculling(at)sysd(dot)com>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Top n queries and GROUP BY
Date: 2003-11-17 17:56:23
Message-ID: 3FB90BC7.5090602@sysd.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Rich Cullingford wrote:
> All,
> This is a straight SQL question, maybe not appropriate for a performance
> list, but...
>
> I have a simple stock holdings setup:
>
> => select * from t1;
> nam | co | num
> -----+-----------+------
> joe | ibm | 600
> abe | ibm | 1500
> joe | cisco | 1200
> abe | cisco | 800
> joe | novell | 500
> joe | microsoft | 200
>
> What I would like to see is a Top-n-holdings-by-name", e.g, for n=2:
>
> nam | co | num
> ----------+--------+-----
> joe | cisco | 1200
> joe | ibm | 600
> abe | ibm | 1500
> abe | cisco | 800
>
> I can get part of the way by using a LIMIT clause in a subquery, e.g,
>
> => select 'abe', a.co, a.num from (select co, num from t1 where
> nam='abe' order by num desc limit 2) as a;
> ?column? | co | num
> ----------+-------+------
> abe | ibm | 1500
> abe | cisco | 800
>
> but I can't figure out a correlated subquery (or GROUP BY arrangement or
> anything else) that will cycle through the names. I vaguely remember
> that these kinds or queries are hard to do in standard SQL, but I was
> hoping that PG, with its extensions...

I forgot about row subqueries; for n=3, for example:

=> SELECT * FROM t1
WHERE (nam,co,num) IN
(SELECT nam,co,num FROM t1 b
where b.nam=t1.nam
order by num desc limit 3)
order by nam, num desc;

nam | co | num
-----+--------+------
abe | ibm | 1500
abe | cisco | 800
joe | cisco | 1200
joe | ibm | 600
joe | novell | 500
(5 rows)

Seems to work...
Thanks all, Rich Cullingford
rculling(at)sysd(dot)com

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Ryszard Lach 2003-11-17 22:20:58 duration logging setting in 7.4
Previous Message Rich Cullingford 2003-11-17 16:38:37 Top n queries and GROUP BY