47 lines
1.5 KiB
SQL
47 lines
1.5 KiB
SQL
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;
|