drop table table70; create table table70 ( id INTEGER, query INTEGER, checksum char(2), score INTEGER ); insert into table70 values (1, 1, 'aa',10); insert into table70 values (2, 2, 'bb',14); insert into table70 values (3, 3, 'cc',11); insert into table70 values (4, 1, 'bb',13); insert into table70 values (5, 2, 'cc',11); insert into table70 values (6, 3, 'aa',13); insert into table70 values (7, 1, 'cc',12); insert into table70 values (8, 2, 'aa',12); insert into table70 values (9, 3, 'bb',11); insert into table70 values (11, 1, 'bb',10); insert into table70 values (12, 2, 'cc',11); insert into table70 values (13, 3, 'aa',13); insert into table70 values (14, 1, 'cc',14); insert into table70 values (15, 2, 'aa',11); insert into table70 values (16, 3, 'bb',13); insert into table70 values (17, 1, 'aa',12); insert into table70 values (18, 2, 'bb',11); insert into table70 values (19, 3, 'cc',12); CREATE TYPE topscores AS (id integer, query integer, checksum char(2), score integer); CREATE OR REPLACE FUNCTION topscores(integer) RETURNS SETOF topscores AS ' DECLARE t topscores%ROWTYPE; r RECORD; q RECORD; i integer; n alias for $1; BEGIN FOR q IN SELECT distinct query from table70 order by query LOOP i := 0; FOR t IN SELECT id , query, checksum, score FROM table70 where query = q.query ORDER BY query, score DESC LOOP i := i + 1; IF i <= n THEN RETURN NEXT t; ELSE EXIT; END IF; END LOOP; END LOOP; RETURN; END; ' language 'plpgsql'; select * from topscores(1) ; select * from topscores(2) ; select * from topscores(3) ; -- -- alternate version using limit rather than count for N -- CREATE TYPE topscores AS (id integer, query integer, checksum char(2), score integer); CREATE OR REPLACE FUNCTION topscores(integer) RETURNS SETOF topscores AS ' DECLARE t topscores%ROWTYPE; r RECORD; q RECORD; n alias for $1; BEGIN FOR q IN SELECT distinct query from table70 order by query LOOP FOR t IN SELECT id , query, checksum, score FROM table70 where query = q.query ORDER BY query, score DESC LIMIT n LOOP RETURN NEXT t; END LOOP; END LOOP; RETURN; END; ' language 'plpgsql';