2017-01-29 3 views
1

Grundsätzlich ich habe zwei Tabellen:AVG beschränkt auf drei letzten Werte für jede Gruppe

Hier Code zwei Tabellen zu erstellen, wenn dies jemand helfen kann, die bereit sein wird, mir zu helfen:

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); 

würde ich Ich möchte den durchschnittlichen Koeffizienten für jede campaign_id basierend auf den letzten 3 protokollierten Koeffizienten für jede campaign_id ermitteln.

Hier Screenshot von zwei Tabellen und führen, dass ich bekommen müssen:

data + result (visual representation)

Das Hauptproblem ist, dass ich keine Ahnung, wie haben diese beiden Tabellen zu verknüpfen, wenn ich für jeden campaign_id nur durchschnittliche Koeffizient brauchen basierend auf 3 neuesten protokollierten nu, glieder dafür :(

ich Hilfe

+1

Bitte akzeptieren Sie die Bearbeitung und fügen Sie die erwartete Ergebnismenge zu Ihrer Frage hinzu. –

Antwort

0

Nach Abfrage Sie die Top-3 Datensätze pro campaign_id aus coefficients Tabelle geben:

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 

nun alles, was Sie tun müssen, ist, eine GROUP BY hinzufügen auf diese Abfrage, average Punktzahl berechnet und mit statistics Tisch kommt, zum Beispiel:

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 

Hier ist die SQL Fiddle.

+0

Erstaunlich! Es tut genau das, was ich brauchte! Schätze deine Hilfe! –

0

In MySQL, der beste Weg, in der Regel schätzen ist Variablen zu verwenden. die Statistik zu erhalten ist nur ein join, das ist also nicht interessant. Lassen Sie uns den Durchschnitt aus der coefficients Tabelle erhalten:

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

Schätzen Sie Ihr Feedback! Leider liefert es nicht wie erwartet Ergebnisse für jede Kampagne: http://printscr.com/e1y398 –

+0

@AntonHrenov. . . Es brauchte die 'Gruppe von' (die ich gerade hinzugefügt habe). –

Verwandte Themen