Use o
ROW_NUMBER() função para isso:SELECT *
FROM (select *,ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY item_id) as RowRank
from items_in_groups
)sub
WHERE RowRank <=2
Demonstração:SQL Fiddle
O
ROW_NUMBER() função atribui um número a cada linha. PARTITION BY é opcional, mas usado para iniciar a numeração para cada valor nesse grupo, ou seja:se você PARTITION BY group_id então, para cada group_id exclusivo valor a numeração começaria em 1. ORDER BY é claro que é usado para definir como a contagem deve ser feita e é necessário no ROW_NUMBER() função.