WITH range_ts AS ( SELECT DATE_TRUNC('minute', ts) as ts FROM generate_series($__timeFrom(), $__timeTo(), '1 minute'::interval) AS ts ), coallated AS (SELECT ts, gi_prev.time as stime, gi_next.time as etime, gi_prev.value as svalue, gi_next.value as evalue, EXTRACT(EPOCH FROM ts-gi_prev.time)/EXTRACT(EPOCH FROM gi_next.time-gi_prev.time) * gi_prev.value + EXTRACT(EPOCH FROM gi_next.time-ts)/EXTRACT(EPOCH FROM gi_next.time-gi_prev.time) * gi_next.value AS samp_value FROM range_ts rts LEFT JOIN LATERAL ( SELECT * FROM "glucose-import" WHERE "time" <= rts.ts ORDER BY "time" DESC LIMIT 1 ) AS gi_prev ON true LEFT JOIN LATERAL ( SELECT * FROM "glucose-import" WHERE "time" >= rts.ts ORDER BY "time" ASC LIMIT 1 ) AS gi_next ON true WHERE gi_prev.time IS NOT NULL and gi_next.time IS NOT NULL AND gi_next.time <> gi_prev.time ), collected AS ( SELECT ts as time, ema(samp_value ::real, 0.33) over (order by ts asc) as smoothval, samp_value as absvalue FROM coallated), firstorder AS ( SELECT time, smoothval, absvalue, smoothval - LAG (smoothval, 1) OVER (ORDER BY time ASC) as delta1st FROM collected), secondorder AS ( SELECT time, smoothval, absvalue, delta1st, delta1st - LAG(delta1st, 1) OVER (ORDER BY time ASC) as delta2nd FROM firstorder) SELECT *, ema(delta1st, 0.25) OVER (ORDER BY time ASC) as smoothdelta1st, ema(delta2nd, 0.25) OVER (ORDER BY time ASC) as smoothdelta2nd FROM secondorder;