create table test ( id integer not null, category varchar(4) not null, elements integer not null default 0 ); insert into test (id, category, elements) values (1,'foo',14); insert into test (id, category, elements) values (2,'foo',10); insert into test (id, category, elements) values (3,'bar',11); insert into test (id, category, elements) values (1,'bar',12); insert into test (id, category, elements) values (1,'baz',13); /* This one returns two rows, as expected*/ select * from ( select rank() over (partition by category order by elements desc) as pos , * from test ) test2 where pos > 1 and id > 1 ; /* This one returns no rows, also expected, because the "and id > 1" clause inside the subquery prevents rank() ever going over 1 */ select * from ( select rank() over (partition by category order by elements desc) as pos , * from test where 1=1 and id > 1 ) test2 where pos > 1