2016-08-16 4 views
2

У меня есть очень простая сводная таблица, в которой суммируются 2 поля в таблице, где записи собираются с 15-минутными интервалами. Так;Сводная таблица MySQL - оценить и отрегулировать

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

возвращает результаты, которых я ожидал бы;

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 

Мой вопрос в том, есть ли способ проверить, что каждое значение суммы никогда не меньше предыдущего значения? и если она возвращает сумму из предыдущего значения времени? (поэтому поэтому суммы всегда совпадают или превышают предыдущее значение времени).

Таблица результатов должна выглядеть следующим образом;

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 

Я предполагаю, что мне нужно какое-то утверждение if? Любые идеи о том, как достичь этого?

Большое спасибо

ответ

0

Вы можете сделать это, используя определенную пользователем переменную, а затем делать некоторые арифметические что-то как

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 

Вот демонстрационный

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 | 
+---------------------+-----------+-----------+ 

Теперь с запросом

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, демо работает отлично, однако sumv alue1 и sumvalue 2 - вычисленные поля. Если я добавлю больше значений в mytable, а затем попробую изменить sumvalue1 и sumvalue2 на сумму (sumvalue1) и sum (sumvalue2) вместе с добавлением группы по времени, я просто получаю фактические расчетные цифры. Не скорректированные цифры .... – EllBrandon

+0

'выберите TIMEVALUE, sumvalue_1 в sumvalue1, sumvalue_2 в sumvalue2 из ( выберите TIMEVALUE, если (@ prev_val1 = сумма (sumvalue1) или @ prev_val1> сумма (sumvalue1), @ prev_val1, сумма (sumvalue1)) как sumvalue_1, if (@ prev_val2 = sum (sumvalue2) или @ prev_val2> sum (sumvalue2), @ prev_val2, sum (sumvalue2)) как sumvalue_2, @ prev_val1: = sum (sumvalue1), @ prev_val2: = сумма (sumvalue2) от туЬаОго, (выберите @ prev_val1: = 0, @ prev_val2: = 0) х группу по TIMEVALUE порядка TIMEVALUE ) х заказа timevalue' – EllBrandon

+0

Да, вы можете изменить EXA mple query и поместите ваш исходный запрос как внутренний запрос, а вместо 'from mytable' вы можете иметь' from (выберите ваш фактический запрос) x, (....) ' –

0

Не самый красивый пример, но все еще должны работать.

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) 
) 
); 
Смежные вопросы