EDIT :devrait maintenant être corrigé avec une sélection à 3 niveaux :
select * from (
select q1.*, rownum as rn from ( --get correct rownum
select * from tbl order by column --get correct order
) q1
) q2
where q2.rn between 1 and 4; -- filter
pour la première partie.
Pour la deuxième et la troisième partie :
where q2.rn between 5 and 8
where q2.rn between 9 and 12