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. Остальное — дело привычки. И да, тот японский блог, который ты нашел, был абсолютно прав.