SELECT q.panelid, q.sensorid, MILLIS_TO_STR(iv.interval) AS interval,
MIN([ABS(STR_TO_MILLIS(el.timestamp)-iv.interval),el])[1] AS el FROM (
SELECT d.panelid, d.sensorid,
ARRAY_FLATTEN(ARRAY_AGG(ARRAY el FOR el IN d.data WHEN el.timestamp BETWEEN "2015-06-04T09:00:00" AND "2015-06-04T17:00:00" END),2) AS data,
MIN(ARRAY {"interval": v} FOR v IN ARRAY_RANGE(STR_TO_MILLIS("2015-06-04T09:00:00"),STR_TO_MILLIS("2015-06-04T17:00:00"),str_to_duration("3h")/1000000) END) AS interval
FROM default d
WHERE panelid="a-si" and sensorid="voc" AND
ANY el IN d.data SATISFIES el.timestamp BETWEEN "2015-06-04T09:00:00" AND "2015-06-04T17:00:00" END
GROUP BY d.panelid, d.sensorid) AS q UNNEST q.interval AS iv UNNEST q.data AS el
GROUP BY q.panelid, q.sensorid, iv.interval;