AVGは

2017-01-29 3 views
1

は基本的に私は2つのテーブルを持って、グループごとに3つの最後の数値に限定されるもの:AVGは

ここでは、これは私を助けることをいとわないだろう誰かを助けることができれば2つのテーブルを作成するためのコードです:私は希望

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の平均係数を取得するようにします。ここで

2つのテーブルのスクリーンショットだと私は取得する必要があることになる:

data + result (visual representation)

主な問題は、私は、各CAMPAIGN_IDのためにのみ平均の係数を必要とする場合、私はこの2つのテーブルを結合する方法が分からないということです私は、MySQLで任意のヘルプ

+1

編集を受け入れて、期待される結果セットを質問に追加してください。 –

答えて

0

は、次のクエリはcoefficientsテーブルからあなたにcampaign_idあたり上位3レコードを与える:のはcoefficientsテーブルから平均値を取得してみましょうこのクエリに、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

に理解するであろう3、最新のログに記録されたのNU、それのためのBER :(

に基づいて、最善の方法は、変数を使用することが通常である。統計情報を取得することがちょうどです、興味深いわけではありません。今

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を追加します

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

@AntonHrenov。 。 。それは(私が追加した) 'group by 'が必要でした。 –