2016-07-27 13 views
0

Ich habe eine Tabelle in MySQL, die periodische Metriken für bestimmte Datenpunkte aufzeichnet. Diese Tabelle enthält effektiv einen Datensatz für jedes festgelegte Intervall für jede Metrik (hier definiert durch metric_id). Ich möchte wissen, wie man die Summe einer Gruppe von Metriken mit dem jeweils letzten Zeitstempel auswählt.Wie kann ich die Summe einer Spalte aus einer Tabelle mit mehreren Einträgen pro Metrik auswählen?

mysql> SELECT value, timestamp, metric_id FROM datapoint 
WHERE metric_id IN (11, 13) ORDER BY timestamp DESC LIMIT 2; 
+-------+---------------------+-----------+ 
| value | timestamp   | metric_id | 
+-------+---------------------+-----------+ 
| 28 | 2016-07-26 21:37:04 |  13 | 
| 4 | 2016-07-26 21:37:05 |  11 | 
+-------+---------------------+-----------+ 
2 rows in set (0.00 sec) 

Was ich will, ist die Summe (32) aus der obigen Tabelle der METRIC_ID der in der IN-Anweisung gegeben zu wählen, in dem für jeden Datensatz, es ist die letzte ein durch Zeitstempel ist.

+0

eine klare Probe Ergebnis als Zahl hier .. sogar Bild –

+0

Was kann ich ein Bild hinzufügen? Ich möchte nur ein Feld SUM (Wert). – user1955162

+0

Möchten Sie alle Wertfelder nach ihrem Zeitstempel summieren? –

Antwort

1

Die Unterabfrage in der folgenden Abfrage identifiziert den letzten Datensatz nach Zeitstempel für jede metric_id Gruppe. Dies wird dann verwendet, um die Werte für jeden dieser jüngsten Datensätze auszuwählen, und die Werte werden dann in der äußeren Abfrage summiert.

SELECT SUM(t1.value) 
FROM datapoint t1 
INNER JOIN 
(
    SELECT metric_id, MAX(timestamp) AS timestamp 
    FROM datapoint 
    GROUP BY metric_id 
) t2 
    ON t1.metric_id = t2.metric_id AND 
     t1.timestamp = t2.timestamp 
WHERE t1.metric_id IN (11, 13) 
+0

Das war es! Danke Tim. Ich muss innere Verbindungen erst noch beherrschen. – user1955162

+0

Es tat, muss ich noch 5 Minuten warten :( – user1955162

0

auf diese Weise versuchen:

SELECT sum(value), date(timestamp), metric_id FROM datapoint 
WHERE metric_id IN (11, 13) group by date(timestamp) ORDER BY timestamp DESC; 
+0

Reds, das, wie zuvor, fasst alle Werte zusammen, nicht nur die neueste. Ich bekomme eine große Nummer. – user1955162

0
select sum(value) from datapoint 
where metric_id in (select metric_id from datapoint group by metric_id having max(timestamp));