我正在使用MySQL数据库。我希望在过去的6个月内逐月产生客户等级。
我刚刚得到以下查询,以确定每月民意调查中客户的排名。只有在一个月内的日期范围内,才能正确报告排名。
select
t1.*,
@rownum := @rownum + 1 AS RANK
from
(
select
date_format(EVE_DATE,'%Y-%m') as MON_DATE,
CUST,
SUM(POLL) as SCORE
from
TABLE
where
EVE_DATE >= '2016-01-01' and EVE_DATE <= '2016-01-31'
group by
MON_DATE,
CUST
order by
SCORE desc
)t1,
(SELECT @rownum := 0) r
order by
RANK DESC
我遇到的问题是,如果我要将日期范围更改为跨越多个月,则显示的排名不正确。我挖得更深了一些意识到这个问题是由于这样一个事实,即当跨越几个月的天数时,每个客户被列出的次数与所涉及的月数一样多。因此,输出中的行数为number_of_customers * number of months
,这意味着每月的排名不再是有意义的值。
例如,如果有100个客户&amp;如果我要计算一个月的等级,我可以拥有的最高等级是100,这是正确的。但是,如果我考虑2个月,排名可以在1到200之间,这是不正确的。这是因为只有100个客户,但由于需要考虑2个月而出现两次。
我如何更正以下查询以正确显示每个月的排名?
select
t2.*
from
(
select
t1.*,
@rownum := @rownum + 1 AS RANK
from
(
select
date_format(EVE_DATE,'%Y-%m') as MON_DATE,
CUST,
SUM(POLL) as SCORE
from
TABLE
where
EVE_DATE >= (curdate() - INTERVAL 3 MONTH)
group by
MON_DATE,
CUST
order by
SCORE desc
)t1,
(SELECT @rownum := 0) r
order by
RANK DESC
)t2
where
t2.CUST= 'customerA'
order by
t2.MON_DATE desc
我很感激在这里帮助我。
答案 0 :(得分:2)
我认为您希望内部子查询仅由客户聚合,而不是由客户和日期聚合:
select t1.*,
@rownum := @rownum + 1 AS RANK
from (select CUST, SUM(POLL) as SCORE
from TABLE
where EVE_DATE >= '2016-01-01' and EVE_DATE <= '2016-01-31'
group by CUST
order by SCORE desc
) t1 cross join
(SELECT @rownum := 0) r
order by RANK DESC;