Я думаю, что вы все еще хотите агрегирование с группировкой :) Так как значения и other_value, кажется, связаны (вы упорядочиваете по значению в окне, чтобы выбрать other_value), я бы просто поместил их в массив:
WITH data as (
SELECT 18 AS value, 1 AS id, "A" AS other_value,
UNION ALL SELECT 20 AS value, 1 AS id, "B",
UNION ALL SELECT 22 AS value, 2 AS id, "C"
UNION ALL SELECT 30 AS value, 3 AS id, "A"
UNION ALL SELECT 37 AS value, 2 AS id, "B"
UNION ALL SELECT 31 AS value, 2 AS id, "C"
UNION ALL SELECT 42 AS value, 1 AS id, "D"
)
select
id,
array_agg(struct(value, other_value)) as data
from data
group by id
Итак, если вам это понадобится позже, вы можете написать подзапрос, чтобы получить его, или вы можете добавить еще один шаг для выполнения в одном запросе с агрегацией между:
WITH data as (
SELECT 18 AS value, 1 AS id, "A" AS other_value,
UNION ALL SELECT 20 AS value, 1 AS id, "B",
UNION ALL SELECT 22 AS value, 2 AS id, "C"
UNION ALL SELECT 30 AS value, 3 AS id, "A"
UNION ALL SELECT 37 AS value, 2 AS id, "B"
UNION ALL SELECT 31 AS value, 2 AS id, "C"
UNION ALL SELECT 42 AS value, 1 AS id, "D"
),
temp as (
select
id,
array_agg(struct(value, other_value)) as data
from data
group by id
)
select
id,
array(select value from unnest(data)) as data,
(select other_value from unnest(data) order by value ASC limit 1) first_other_data,
(select other_value from unnest(data) order by value DESC limit 1) last_other_data
from temp