【发布时间】:2016-04-24 20:46:09
【问题描述】:
我正在使用 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 个客户,如果我要计算一个月的排名,我可以拥有的最大排名是 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
如果能帮到我,我将不胜感激。
【问题讨论】: