我有一个格式的mysql表,我们称之为product_revenue Product_id,年,月,收入
我需要获得以下列: 年,月,revenue_top_5_monthly
其中revenue_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个月超过10米的行,因此最终查询速度具有很大的相关性。一个月它目前需要大约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将预期的行返回为named。
答案 0 :(得分:1)
尝试此查询
select * from
(select
@rn:=if(@prv=product_id, @rn+1, 1) as rId,
@prv:=product_id as product_id,
year,
month,
revenue
from tbl
join
(select @prv:=0, @rn:=0)tmp
order by
product_id, revenue desc) a
where rid<=5
| RID | PRODUCT_ID | YEAR | MONTH | REVENUE |
---------------------------------------------
| 1 | 1 | 2013 | 1 | 100 |
| 2 | 1 | 2013 | 1 | 90 |
| 3 | 1 | 2013 | 1 | 70 |
| 4 | 1 | 2013 | 1 | 60 |
| 5 | 1 | 2013 | 1 | 50 |
| 1 | 2 | 2013 | 1 | 5550 |
| 2 | 2 | 2013 | 1 | 550 |
| 3 | 2 | 2013 | 1 | 520 |
| 4 | 2 | 2013 | 1 | 510 |
| 5 | 2 | 2013 | 1 | 150 |
答案 1 :(得分:0)
也许:
SELECT t1.year,
t1.month,
(SELECT SUM(t2.revenue)
FROM product_revenue t2
WHERE t2.month = t1.month
AND t2.year = t1.year
ORDER BY t2.revenue DESC LIMIT 5 ) AS revenue_top_5
FROM product_revenue t1
GROUP BY t1.year, t1.month
答案 2 :(得分:-1)
试试这个和c。
select top 5 'y' as year,'x' as month,sum(total) as top_5 From
(select sum(revenue) as total from product_revenue
where month=x and year=y
order by revenue desc) as t