2017-01-29 1 views
1

В принципе у меня есть две таблицы:AVG ограничивается до 3 последних значений для каждой группы

Вот код, чтобы создать две таблицы, если это может помочь кому-то, кто будет готов помочь мне:

CREATE TABLE IF NOT EXISTS `coefficients` ( 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `datetime` datetime NOT NULL, 
    `campaign_id` int(11) NOT NULL, 
    `score` decimal(10,2) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; 

INSERT INTO `coefficients` (`id`, `datetime`, `campaign_id`, `score`) VALUES  
    (1, '2017-01-29 22:32:13', 1, 20.00), 
    (2, '2017-01-29 22:36:22', 1, 34.00), 
    (3, '2017-01-29 22:36:30', 1, 30.00), 
    (4, '2017-01-29 22:36:43', 1, 1000.00), 
    (5, '2017-01-29 22:37:13', 2, 10.00), 
    (6, '2017-01-29 22:37:26', 2, 15.00), 
    (7, '2017-01-29 22:37:43', 2, 20.00), 
    (8, '2017-01-29 22:30:51', 2, 1000.00); 

CREATE TABLE IF NOT EXISTS `statistics` ( 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `campaign_id` int(11) NOT NULL, 
    `stats1` int(11) NOT NULL, 
    `stats2` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

INSERT INTO `statistics` (`id`, `campaign_id`, `stats1`, `stats2`) VALUES 
    (1, 1, 34, 38), 
    (2, 2, 23, 45); 

Я бы как получить средний коэффициент для каждого campaign_id, рассчитанный на основе последних 3 зарегистрированных коэффициентов для каждого campaign_id.

Вот скриншот из двух таблиц и результат, что мне нужно получить:

data + result (visual representation)

Основная проблема заключается в том, что я понятия не имею, как соединить эти две таблицы, если мне нужно только средний коэффициент для каждого CAMPAIGN_ID на основе 3 последней регистрируемой ню, Берс для него :(

Я буду признателен за любую помощь

+1

Примите изменения и добавьте ожидаемый результат на свой вопрос. –

ответ

0

После запроса даст вам лучшие 3 записей в campaign_id из coefficients таблицы:

SET @currcount = NULL, @currvalue = NULL; 
SELECT id, campaign_id, score, c_index FROM (
    SELECT 
    id, campaign_id, score, 
    @currcount := IF(@currvalue = campaign_id, @currcount + 1, 1) AS c_index, 
    @currvalue := campaign_id AS s 
    FROM coefficients 
    order by id 
) AS a where c_index <= 3 

Теперь, все, что вам нужно сделать, это добавить GROUP BY на этот запрос, рассчитать average счет и присоединиться к нему с statistics столом, например:

SET @currcount = NULL, @currvalue = NULL; 
SELECT a.id, a.campaign_id, avg(score), c_index, s.stats1, s.stats2 FROM (
    SELECT 
    id, campaign_id, score, 
    @currcount := IF(@currvalue = campaign_id, @currcount + 1, 1) AS c_index, 
    @currvalue := campaign_id AS s 
    FROM coefficients 
    order by id 
) AS a join statistics s on a.campaign_id = s.campaign_id 
where c_index <= 3 
group by campaign_id 

Вот SQL Fiddle.

+0

Удивительно! Он делает именно то, что мне нужно! Ценю вашу помощь! –

0

в MySQL, лучший способ, как правило, использовать переменные. Получение статистики просто join, так что это не интересно. Давайте получить среднее из coefficients таблицы:

select c.campaign_id, avg(c.score) as avg_score 
from (select c.*, 
      (@rn := if(@c = c.campaign_id, @rn + 1, 
         if(@c := c.campaign_id, 1, 1) 
         ) 
      ) as rn 
     from coefficients c cross join 
      (select @rn := 0, @c := -1) params 
     order by c.campaign_id, c.datetime desc 
    ) c 
where rn <= 3 
group by c.campaign_id; 
+0

Цените свои отзывы! К сожалению, он не дает результата для каждой кампании, как ожидалось: http://prntscr.com/e1y398 –

+0

@ Антон Хренов. , , Ему нужна группа «by by» (которую я только что добавил). –

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