我有一个格式的mysql表,我们称之为product_revenue Product_id,year,month,revenue
我需要得到以下列:年,月,收入_top_5_monthly
其中income_top_5_monthly 是当月收入最高的产品的收入总和。排名前 5 位的产品因月而异。
我可以通过使用子查询选择一个月,按收入排序并使用限制 5,然后对值求和,然后在单个查询中为每个月执行此操作,我可以在一个月内执行此操作
我所拥有的是
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
但我每个月都需要它一次。
product_revenue 表在 16 个月内有超过 1000 万行,因此最终查询速度具有很大的相关性。目前一个月大约需要 80-100 秒,我必须在 1 小时 30 分钟的时间段内运行大约 30 个这样的查询,每个查询需要整个 16 个月。
按照建议,我也尝试过
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
但不返回任何行。单独的子查询 a 和 b 按命名返回预期的行。