Errors
Trino

Trino: Presto equivalent of MySQL group_concat

Переходишь с MySQL на Trino и понимаешь, что мир уже не будет прежним. Пропали привычные функции, а вместо них — сила массивов и оконных функций. И да, group_co

Переходишь с MySQL на Trino и понимаешь, что мир уже не будет прежним. Пропали привычные функции, а вместо них — сила массивов и оконных функций. И да, group_concat в его классическом виде — среди пропавших.

Но не всё так плохо. Твой запрос из MySQL почти один в один ложится на Trino. Просто под другим именем.

Прямой аналог

То, что ты нашел — рабочий и правильный путь. Конструкция array_agg() собирает значения в массив, а array_join() склеивает элементы массива в строку, используя указанный разделитель.

-- MySQL
select
  a,
  group_concat(b separator ',')
from table
group by a
-- Trino (ранее Presto)
select
  a,
  array_join(array_agg(b), ',')
from table
group by a

Эти два запроса функционально эквивалентны. Если в группе для a были значения b = ‘x’, ‘y’, ‘z’, оба вернут строку x,y,z.

Нюансы, о которых стоит знать

В MySQL group_concat по умолчанию использует запятую без пробела. array_join в Trino ведет себя так же — ты явно передаешь разделитель.

Что насчет сортировки? В MySQL ты мог добавить ORDER BY b внутри group_concat. В Trino для этого нужно управлять порядком в array_agg. По умолчанию порядок не гарантирован.

select
  a,
  array_join(array_agg(b ORDER BY b), ',') -- вот так
from table
group by a

А если нужны только уникальные значения, как group_concat(DISTINCT b)? Все та же логика — контроль на этапе агрегации.

select
  a,
  array_join(array_agg(DISTINCT b), ',')
from table
group by a

Почему именно так

Trino вырос из Presto, который создавался для аналитических запросов к большим данным. Мир Hadoop и колоночных хранилищ. Там операции с массивами и структурами — основа основ.

array_agg — это стандартная функция SQL для агрегации в массив. array_join — ее логичное дополнение. Такой подход универсален и мощнее простого group_concat.

Можешь собрать в массив не только строки, но и числа, даты, а потом преобразовать их как душе угодно. Или передать массив дальше, в другую функцию, без преобразования в строку.

Итог

Забудь про group_concat. В мире Trino твой новый друг — связка array_agg + array_join. Она делает то же самое, а даже больше.

Просто помни про порядок элементов и необходимость явно указывать DISTINCT. Остальное — дело привычки. И да, тот японский блог, который ты нашел, был абсолютно прав.