Позвольте мне сделать предположение, что значение max
действительно не нужно. То есть вы ищете первое значение "min" в table2
.
. Позвольте мне также предположить, что table2
не очень велико.
Следующее может показаться громоздким, но он может делать то, что вы хотите:
select t1.*,
(select min(minval)
from unnest(t2.ar) minval
where val >= minval
) as min
from table1 t1 cross join
(select array_agg(t2.min order by min) as ar
from table2 t2
) t2;
Если это работает, тогда вы можете присоединиться к table2
, чтобы получить минимальное значение.
Почему это может работать лучше? По сути, BigQuery видит ваш запрос и решает, что ему нужно отправить много данных повсюду. При преобразовании table2
в массив только массив отправляется туда, где находятся данные table1
. Затем unnest()
является локальным для каждой записи в table1
. По моему опыту, это может быть большой выигрыш в производительности.
РЕДАКТИРОВАТЬ:
Поскольку вы, похоже, ищете одно совпадение, другой метод состоит в чередовании двух таблиц, используйте накопительное окно функции, а затем фильтр:
with t as (
select t1.myint64, null as t2min
from t1
union all
select null, t2.min
from t2
)
select t.*
from (select t.*, max(t2min) over (order by coalesce(t2min, myint64)) as real_t2min
from t
) t
where t2min is null;
Еще раз, если вам нужно max()
, вы можете join
вернуться к t2
.