2015-01-27 4 views
0

У меня есть таблица с двумя столбцами. Первый («val») является целым числом, второй - меткой времени («ts»).Вычислить разницу между первым и последним результатом

Теперь я хочу рассчитать разницу между первым и последним значением заданного промежутка времени.

SELECT MAX(val) - MIN(val) AS difference WHERE ts >= '2015-01-01 00:00:00' AND ts <= '2015-01-07 23:59:59' 

Этого недостаточно, поскольку с течением времени значения могут превышать/подрезать первое и последнее значение.

Пример: День 1: 100 День 2: 120 День 3: 110 День 4: 98 День 5: 105 День 6: 112 День 7: 110

Разница заключается в том 110 (День 7) минус 100 (День 1) = 10. Не Макс (val) = 120 минус Мин (val) = 98 = 22

Спасибо!

ответ

0

Join к подзапрос, который возвращает первый и последний даты и присоединиться с помощью тех и использовать простую арифметику, чтобы вычислить разницу с помощью sum():

select sum(val * case ts when ts1 then -1 else 1 end) diff 
from data 
join (select min(ts) ts1, max(ts) ts2 
     from data 
     where ts between ? and ?) x 
on ts in (ts1, ts2) 

См demo (демонстрационная схема была упрощена, чтобы выделить суть решения).

0

Один из способов заключается в использовании двух подзапросов, один, который получает первое значение, и один, который получает последнее значение:

SELECT ((SELECT val 
     FROM table t 
     WHERE ts >= '2015-01-01 00:00:00' AND ts <= '2015-01-07 23:59:59' 
     ORDER BY val DESC 
     LIMIT 1 
     ) - 
     (SELECT val 
     FROM table t 
     WHERE ts >= '2015-01-01 00:00:00' AND ts <= '2015-01-07 23:59:59' 
     ORDER BY val ASC 
     LIMIT 1 
     ) 
     ) as difference