sql selecciona los 5 mejores cada mes

Tengo una tabla mysql del formato, llamémosla product_revenue Product_id, año, mes, ingresos

y necesito obtener las siguientes columnas: año, mes, revenue_top_5_monthly

donde revenue_top_5_monthly es la suma de los ingresos de los productos que tuvieron los ingresos más altos en ese mes. Los 5 productos principales varían de mes a mes.

Puedo hacer esto por un solo mes seleccionando con una subconsulta un solo mes, clasificando por ingresos y usando el límite 5, luego resumiendo el valor, pero no sabría cómo hacerlo para cada mes en una sola consulta

Lo que tengo es

select 'y' as year, 'x' as month, sum(revenue) as revenue_top_5 from
(select revenue from product_revenue
where month=x and year=y
order by revenue desc
limit 5) as top5

Pero lo necesito para cada mes en una sola toma.

La tabla product_revenue tiene más de 10 m de filas durante 16 meses, por lo que la velocidad de consulta final es de gran importancia. Durante un mes, actualmente toma alrededor de 80-100 segundos, y tengo que realizar unas 30 consultas de este tipo, cada una durante los 16 meses completos, en un espacio de 1 hora y 30 minutos.

como sugerí, también lo intenté

select * from
(
select dd.year, dd.monthnumber,
u.product_id, sum(revenue) as revenue
from source
group by 1,2,3
)a
where 
(select count(*) from
                            (select dd.year, dd.monthnumber,
                            u.product_id, sum(revenue) as revenue
                            from source
                            group by 1,2,3)b
where b.year=a.year and b.monthnumber=a.monthnumber and b.revenue<=a.revenue
)<=5

pero no devuelve filas. Las subconsultas individuales a y b devuelven las filas esperadas con el nombre.

Respuestas a la pregunta(3)

Su respuesta a la pregunta