Select object based on agg value

select d.panelid, d.sensorid ,array_flatten(array_agg(array el for el in d.data when el.timestamp between "2015-06-04T06:00:00" and "2015-06-05T18:00:00" end),2) as data

from (SELECT panelid, sensorid, array_flatten(array_agg(a.data),2) as data FROM `data` a 
WHERE panelid="a-si" AND sensorid="voc" AND date BETWEEN "2015-06-04" and "2015-06-05"
group by panelid, sensorid) as d

group by d.panelid, d.sensorid

when I run this query I get:

[
  {
    "data": [
      {
        "quality": "raw",
        "timestamp": "2015-06-04T06:00:28",
        "value": 33.722383
      },
      {
        "quality": "raw",
        "timestamp": "2015-06-04T06:01:32",
        "value": 33.739573
      },
      {
        "quality": "raw",
        "timestamp": "2015-06-04T06:02:35",
        "value": 33.744834
      } 
      .......

I need to change it so that I get the object (only one) with the lowest (or highest ie aggregate) “value” property. I want the structure to stay the same.

SELECT panelid, sensorid, MIN([d.value,d])[1] AS data FROM `data` a UNNEST a.data AS d
WHERE panelid="a-si" AND sensorid="voc" AND date BETWEEN "2015-06-04" and "2015-06-05"
GROUP BY panelid, sensorid;
[
  {
    "code": 3000,
    "msg": "Wrong number of arguments to function MIN. - at )",
    "query_from_user": "SELECT panelid, sensorid, MIN(d.`value`,d)[1] AS data FROM `data` a UNNEST a.data AS d\nWHERE panelid=\"a-si\" AND sensorid=\"voc\" AND date BETWEEN \"2015-06-04\" and \"2015-06-05\"\nGROUP BY panelid, sensorid;"
  }
]
SELECT panelid, sensorid, MIN([d.value,d])[1] AS data FROM `data` a UNNEST a.data AS d
WHERE panelid="a-si" AND sensorid="voc" AND date BETWEEN "2015-06-04" and "2015-06-05"
GROUP BY panelid, sensorid;

It’s close, but I need to specify that the timestamp is between “2015-06-04T06:00:00” and “2015-06-05T18:00:00”

SELECT panelid, sensorid, MIN([d.value,d])[1] AS data FROM `data` a UNNEST a.data AS d
WHERE panelid="a-si" AND sensorid="voc" AND date BETWEEN "2015-06-04" and "2015-06-05"
AND d.timestamp BETWEEN "2015-06-04T06:00:00" AND "2015-06-05T18:00:00"
GROUP BY panelid, sensorid;

I had to change MIN(d.value,d)[1] into MIN([d.value,d])[1], but what does it mean?

MIN takes single argument finds minimum value.
In this case the argument is array of 2 elements.
i.e. [d.value,d] . 0th position contains actual MIN value and 1st position is place holder in this case d which we are interested to project.
Internal array aggregate does MIN based on ARRAY comparison, It only goes to 1st element when 0th element is equal.
Eventually we have MIN value of array
MIN([d.value,d])[1] will project the 1st element.
This way N1QL can project another value during MIN. Normally it is not possible. But with N1QL it is possible.
Same can be used for MAX()