Top n queries and GROUP BY - Mailing list pgsql-performance

From Rich Cullingford
Subject Top n queries and GROUP BY
Date
Msg-id 3FB8F98D.1010707@sysd.com
Whole thread Raw
Responses Re: Top n queries and GROUP BY  (Rich Cullingford <rculling@sysd.com>)
List pgsql-performance
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...

                   Thanks, Rich Cullingford
                           rculling@sysd.com



pgsql-performance by date:

Previous
From: Joel Jacobson
Date:
Subject: Backup/restore of pg_statistics
Next
From: Rich Cullingford
Date:
Subject: Re: Top n queries and GROUP BY