You can say something like this (untested);
with actors ( name , counter , rank )
as
( SELECT name = a.name ,
counter = COUNT(*) ,
rank = rank() over ( order by count(*) desc )
FROM actors a
JOIN movies_actors ma ON a.a_id = ma.a_id
JOIN movies m ON m.m_id = ma.m_id
GROUP BY name
)
select *
from actors
where rank = 1
or (a little simpler)
select *
from ( SELECT name = a.name ,
counter = COUNT(*) ,
rank = rank() over ( order by count(*) desc )
FROM actors a
JOIN movies_actors ma ON a.a_id = ma.a_id
JOIN movies m ON m.m_id = ma.m_id
GROUP BY name
) t
where t.rank = 1
Or you can avoid partitioning the result set and ranking it by using something like this:
select t.movies , a.*
from ( select actor_id = a_id ,
movies = count(*)
from movies_actors
group by a_id
) t
join ( select max_movie = max( t.movie_count )
from ( select actor_id = a_id ,
movie_count = count(*)
from movies_actors
group by a_id
) t
) x on x.max_movies = t.movies
join actors a on a.id = t.a_id