【发布时间】:2013-05-15 08:57:17
【问题描述】:
我有一个格式的mysql表,我们称之为product_revenue Product_id、年、月、收入
我需要获取以下列: 年、月、收入_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 按命名返回预期的行。
【问题讨论】:
-
听起来你需要在
(year, month)上建立一个复合索引 -
它来自日期维度表,单独索引与复合索引只会影响性能,而不是输出行数,对吧?