2016-04-24 6 views
1

Я использую базу данных MySQL. Я ищу, чтобы создать рейтинг клиентов с каждым месяцем за последние 6 месяцев.MySQL - Звание за месяц по нескольким месяцам

У меня только следующий запрос, чтобы определить ранг клиента в ежемесячном опросе. Это правильно сообщает ранг, только если диапазон дат за один месяц.

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 

Буду признателен за любую помощь здесь, чтобы получить меня, пожалуйста.

ответ

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; 
+0

Спасибо Гордон. Если бы я упустил дату, я не получу рейтинг в месяц, как я вижу. Как я могу сделать это с группой по месяцам, пожалуйста? – usert4jju7

Смежные вопросы