【问题标题】:MySQL - Rank per month across several monthsMySQL - 在几个月内每月排名
【发布时间】: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

如果能帮到我,我将不胜感激。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我认为您希望内部子查询仅按客户聚合,而不是按客户和日期:

    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;
    

    【讨论】:

    • 谢谢戈登。如果我要遗漏日期,我将不会获得每月排名,因为我可以看到。请问我怎么能按月按组来做呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2014-09-13
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多