Объединить строки в список в PrestoSQL

В настоящее время в моей таблице три разных поля: id1, id2 и actions. action имеет строковый тип. Например, моя таблица выглядит примерно так:

id1   |   id2  |   actions
---------------------------
"a1"      "a2"     "action1"
"b1"      "b2"     "action2"
"a1"      "a2"     "action3"

Если значения id1, а также значенияid2 одинаковы для любого количества строк, я хочу объединить эти строки, чтобы поле actions стало списком строк. Если ни одна из строк не имеет одинаковых значений для id1 и одинаковых значений для id2, я все равно хочу преобразовать поля actions как список, но только с одной строкой. Например, результат запроса должен выглядеть примерно так:

id1   |   id2  |   actions
---------------------------
"a1"      "a2"     ["action1", "action3"]
"b1"      "b2"     ["action2"]

Я знаю некоторые основы Presto и могу объединять столбцы в зависимости от условий, но не был уверен, можно ли этого добиться с помощью запроса. Если это может быть достигнуто, что является хорошим подходом для реализации этой логики?


person Telepresence    schedule 27.03.2019    source источник


Ответы (2)


Попробуйте использовать ARRAY_JOIN с ARRAY_AGG:

SELECT
    id1,
    id2,
    ARRAY_JOIN(ARRAY_AGG(actions), ',') actions
FROM yourTable
GROUP BY
    id1,
    id2;
person Tim Biegeleisen    schedule 27.03.2019
comment
ARRAY_JOIN(ARRAY_AGG( это изменяет порядок. Вы знаете, как это решить? В этом вопросе для a1 я хочу поддерживать порядок, поэтому контакт должен быть action1,action2 Но много раз я получаю неуместной заказ, например action2,action1 - person Bhuvanesh; 26.03.2020
comment
Если вы хотите сохранить заказ, обратитесь к array_agg(x ORDER BY y DESC) - person Vision; 12.08.2020

Если вы хотите получить результат в виде массива, вы можете использовать flatten вместо array_join:

select   
    id1,  id2,   flatten(array_agg(actions)) as actions  
from table  
group by id1, id2  
person Tomás Grosso    schedule 28.10.2019