2016-08-16 2 views
2

Ich habe eine sehr einfache Übersichtstabelle, die 2 Felder in einer Tabelle zusammenfasst, in der Datensätze in 15-Minuten-Intervallen gesammelt werden. Damit;MySQL Übersichtstabelle - bewerten und anpassen

SELECT timevalue, SUM(value1) AS sumvalue1, SUM(value2) AS sumvalue2 
FROM table 
GROUP BY timevalue 

gibt die Ergebnisse zurück, die ich erwarten würde;

timevalue  sumvalue1 sumvalue2 
------------------------------------- 
16/08/2016 08:30 3000  200 
16/08/2016 08:45 3200  150 
16/08/2016 09:00 3100  400 
16/08/2016 09:15 3300  450 
16/08/2016 09:30 3400  600 

Meine Frage ist, gibt es eine Möglichkeit, dass jeder Summenwert zu überprüfen, ist nie weniger als der vorherige Wert? und wenn es die Summe vom vorherigen timeval zurückgibt? (also sind die Summenwerte immer gleich oder größer als der vorherige Zeitwert).

Die Ergebnistabelle sollte dann so aussehen;

timevalue  sumvalue1 sumvalue2 
------------------------------------- 
16/08/2016 08:30 3000  200 
16/08/2016 08:45 3200  200 
16/08/2016 09:00 3200  400 
16/08/2016 09:15 3300  450 
16/08/2016 09:30 3400  600 

Ich schätze, ich brauche eine Art von if-Anweisung? Irgendwelche Ideen, wie man das erreicht?

Vielen Dank

Antwort

0

Sie können dies die benutzerdefinierte Variable und dann als

select timevalue,sumvalue_1 as sumvalue1, sumvalue_2 as sumvalue2 from 
(
select 
timevalue, 
if(@prev_val1 = sumvalue1 or @prev_val1 > sumvalue1,@prev_val1,sumvalue1) as sumvalue_1, 
if(@prev_val2 = sumvalue2 or @prev_val2 > sumvalue2,@prev_val2,sumvalue2) as sumvalue_2, 
@prev_val1 := sumvalue1, 
@prev_val2 := sumvalue2 
from mytable,(select @prev_val1:=0,@prev_val2:=0)x 
order by timevalue 
)x 
order by timevalue 

Hier einige Arithmetik etwas zu tun, ist eine Demo

create table mytable (
timevalue datetime, 
sumvalue1 int, 
sumvalue2 int 
); 

insert into mytable values 
('2016-08-16 08:30:00',3000,200), 
('2016-08-16 08:45:00',3200,150), 
('2016-08-16 09:00:00',3100,400), 
('2016-08-16 09:15:00',3300,450), 
('2016-08-16 09:30:00',3400,600); 


mysql> select * from mytable; 
+---------------------+-----------+-----------+ 
| timevalue   | sumvalue1 | sumvalue2 | 
+---------------------+-----------+-----------+ 
| 2016-08-16 08:30:00 |  3000 |  200 | 
| 2016-08-16 08:45:00 |  3200 |  150 | 
| 2016-08-16 09:00:00 |  3100 |  400 | 
| 2016-08-16 09:15:00 |  3300 |  450 | 
| 2016-08-16 09:30:00 |  3400 |  600 | 
+---------------------+-----------+-----------+ 

Jetzt mit der Abfrage

mysql> select timevalue,sumvalue_1 as sumvalue1, sumvalue_2 as sumvalue2 from 
    -> (
    -> select 
    -> timevalue, 
    -> if(@prev_val1 = sumvalue1 or @prev_val1 > sumvalue1,@prev_val1,sumvalue1) as sumvalue_1, 
    -> if(@prev_val2 = sumvalue2 or @prev_val2 > sumvalue2,@prev_val2,sumvalue2) as sumvalue_2, 
    -> @prev_val1 := sumvalue1, 
    -> @prev_val2 := sumvalue2 
    -> from mytable,(select @prev_val1:=0,@prev_val2:=0)x 
    -> order by timevalue 
    ->)x 
    -> order by timevalue; 
+---------------------+-----------+-----------+ 
| timevalue   | sumvalue1 | sumvalue2 | 
+---------------------+-----------+-----------+ 
| 2016-08-16 08:30:00 |  3000 |  200 | 
| 2016-08-16 08:45:00 |  3200 |  200 | 
| 2016-08-16 09:00:00 |  3200 |  400 | 
| 2016-08-16 09:15:00 |  3300 |  450 | 
| 2016-08-16 09:30:00 |  3400 |  600 | 
+---------------------+-----------+-----------+ 
+0

Hi Abhik, das Demo funktioniert super, aber sumv alue1 und sumvalue 2 sind berechnete Felder. Wenn ich mehr Werte in mytable einfüge und dann versuche, den sumvalue1 und sumvalue2 zu sum (sumvalue1) und sum (sumvalue2) zusammen mit adding group nach timevalue zu ändern, erhalte ich nur die tatsächlich berechneten Zahlen. Nicht die bereinigten Zahlen .... – EllBrandon

+0

'select ZeitWert, sumvalue_1 als sumvalue1, sumvalue_2 als sumvalue2 von ( wählen ZeitWert, if (@ prev_val1 = sum (sumvalue1) oder @ prev_val1> Summe (sumvalue1), @ prev_val1, sum (sumvalue1)) als sumvalue_1, if (@ prev_val2 = Summe (Summe2) oder @Vor_Val2> Summe (SummeWert2), @Vorv2, Summe (SummeWert2)) als SummeWert2, @Vorausgabe1: = Summe (SummeWert1), @ prev_val2: = SUMME (sumvalue2) von mytable, (select @ prev_val1: = 0, @ prev_val2: = 0) x Gruppe von ZeitWert Auftrag von ZeitWert ) x Auftrag von timevalue' – EllBrandon

+0

Ja können Sie die EXA ändern mple Abfrage und legen Sie Ihre ursprüngliche Abfrage als innere Abfrage etwas als anstelle von 'von Mytable' können Sie haben' von (wählen Sie Ihre tatsächliche Abfrage) x, (....) ' –

0

nicht das schönste Beispiel soll aber immer noch funktionieren.

INSERT INTO SecondTable VALUES (
    NOW(), 
    GREATEST(
    YOUR_SUM_1, (SELECT sumvalue1 FROM FirstTable ORDER BY timevalue DESC LIMIT 1) 
), 
    GREATEST(
    YOUR_SUM_2, (SELECT sumvalue2 FROM FirstTable ORDER BY timevalue DESC LIMIT 1) 
) 
);