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;
