Note: Solution at the end of the question
I have accumulated energy data every 15min in my table. I need to query this data to get the energy spent every hour of the current day. To do so, I need to select the value of every hour and substract it from the value of the previous one, as shown in the picture.
With the following code I've already selected the hourly data, as shown in the result below:
SELECT DATE_FORMAT(FechaHora, '%Y-%m-%d %H:00:00')as Horas, FechaHora, Pan_kWh_im
FROM gaia_piloto1 T1
JOIN (
SELECT DATE_FORMAT(FechaHora, '%Y-%m-%d %H:00:00') AS Horas, MAX(FechaHora) AS MaxFH
FROM gaia_piloto1
WHERE FechaHora BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') AND DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59')
GROUP BY Horas) T2
ON T1.FechaHora = T2.MaxFH
Now I need to add some more code to do the substraction of consecutive rows. How can I do it?
Thank you in advance for all your help,
SOLUTION: Thanks to the suggestion made in the comments, I came with this solution, maybe not optimal but suits my needs:
SELECT T4.Horas, T4.kWh_hr
FROM (
SELECT T3.Horas, T3.FechaHora, T3.Pan_kWh_im, (T3.Pan_kWh_im - @lastValue) AS kWh_hr, @lastValue:=T3.Pan_kWh_im AS Calc
FROM (SELECT @lastValue := 0 ) initvars,
( SELECT DATE_FORMAT(FechaHora, '%Y-%m-%d %H:00:00')as Horas, FechaHora, Pan_kWh_im
FROM gaia_piloto1 T1
JOIN ( (SELECT FechaHora AS Horas, FechaHora AS MinFH
FROM gaia_piloto1
WHERE FechaHora <= DATE_FORMAT(NOW() - INTERVAL 1 Day,'%Y-%m-%d 23:01:00')
ORDER BY Horas DESC
LIMIT 1)
UNION
(SELECT DATE_FORMAT(FechaHora, '%Y-%m-%d %H:00:00') AS Horas, MIN(FechaHora) AS MinFH
FROM gaia_piloto1
WHERE FechaHora BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') AND DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59')
GROUP BY Horas
ORDER BY Horas DESC)
) T2
ON T1.FechaHora = T2.MinFH
ORDER BY FechaHora ) T3
) T4
WHERE Horas >= DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')