Вы можете использовать оконные функции, чтобы решить эту проблему с наибольшим числом групп:
select *
from
select t.*, row_number() over(partition by caller order by number_of_calls desc) rn
from mytable t
) t
where rn <= 3
order by caller, rn
В подзапросе row_number()
ранжирует записи, имеющие одинаковые caller
, по убыванию number_of_calls
. Затем внешние запросы фильтруются в верхних 3 записях по caller
.