One option uses window functions in a subquery to rank the timestamps by increasing and descending
value, then conditional aggregation in the outer query to bring the relevant values
select id, bucket, percentile_cont(0.5) within group (order by value) median_value, min(value) min_value, max(timestamp_utc) filter(where rn_asc = 1) min_timestamp, max(value) max_value, max(timestamp_utc) filter(where rn_desc = 1) max_timestamp from ( select t.*, row_number() over(partition by id, bucket order by value) rn_asc, row_number() over(partition by id, bucket order by value desc) rn_desc from ( select t.*, time_bucket('60', timestamp_utc) as bucket from rs.mytable t where id in (1111,123) and timestamp_utc between '2020-11-05 10:00:15.748643'::timestamp and '2020-11-05 16:35:48.750313'::timestamp ) t ) t group by id, bucket order by id, bucket
Note that we need to compute the bucket first, and put it in the partition of the window function.
CLICK HERE to find out more related problems solutions.