 WITH range_ts AS (
         SELECT date_trunc('minute'::text, ts.ts) AS ts
           FROM generate_series(( SELECT min("glucose-import"."time") AS min
                   FROM "glucose-import"), ( SELECT max("glucose-import"."time") AS max
                   FROM "glucose-import"), '00:01:00'::interval) ts(ts)
        ), coallated AS (
         SELECT rts.ts,
            gi_prev."time" AS stime,
            gi_next."time" AS etime,
            gi_prev.value AS svalue,
            gi_next.value AS evalue,
            (EXTRACT(epoch FROM rts.ts - gi_prev."time") / EXTRACT(epoch FROM gi_next."time" - gi_prev."time"))::double precision * gi_prev.value + (EXTRACT(epoch FROM gi_next."time" - rts.ts) / EXTRACT(epoch FROM gi_next."time" - gi_prev."time"))::double precision * gi_next.value AS samp_value
           FROM range_ts rts
             LEFT JOIN LATERAL ( SELECT "glucose-import".id,
                    "glucose-import".serialnum,
                    "glucose-import".devicetype,
                    "glucose-import".units,
                    "glucose-import".value,
                    "glucose-import"."time"
                   FROM "glucose-import"
                  WHERE "glucose-import"."time" <= rts.ts
                  ORDER BY "glucose-import"."time" DESC
                 LIMIT 1) gi_prev ON true
             LEFT JOIN LATERAL ( SELECT "glucose-import".id,
                    "glucose-import".serialnum,
                    "glucose-import".devicetype,
                    "glucose-import".units,
                    "glucose-import".value,
                    "glucose-import"."time"
                   FROM "glucose-import"
                  WHERE "glucose-import"."time" >= rts.ts
                  ORDER BY "glucose-import"."time"
                 LIMIT 1) 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 coallated.ts AS "time",
            ema(coallated.samp_value::real, 0.33::real) OVER (ORDER BY coallated.ts) AS smoothval,
            coallated.samp_value AS absvalue
           FROM coallated
        ), firstorder AS (
         SELECT collected."time",
            collected.smoothval,
            collected.absvalue,
            collected.smoothval - lag(collected.smoothval, 1) OVER (ORDER BY collected."time") AS delta1st
           FROM collected
        ), secondorder AS (
         SELECT firstorder."time",
            firstorder.smoothval,
            firstorder.absvalue,
            firstorder.delta1st,
            firstorder.delta1st - lag(firstorder.delta1st, 1) OVER (ORDER BY firstorder."time") AS delta2nd
           FROM firstorder
        )
 SELECT "time",
    smoothval,
    absvalue,
    delta1st,
    delta2nd,
    ema(delta1st, 0.25::real) OVER (ORDER BY "time") AS smoothdelta1st,
    ema(delta2nd, 0.25::real) OVER (ORDER BY "time") AS smoothdelta2nd,
    stddev(delta1st) OVER (ORDER BY "time" RANGE BETWEEN '02:00:00'::interval PRECEDING AND CURRENT ROW) AS std_dev_delta1st,
    avg(absvalue) OVER (ORDER BY "time" RANGE BETWEEN '3 mons'::interval PRECEDING AND CURRENT ROW) AS "3mo_eabg",
    avg(absvalue) OVER (ORDER BY "time" RANGE BETWEEN '7 days'::interval PRECEDING AND CURRENT ROW) AS week_eabg
   FROM secondorder;
