Конденсирующие массивы в Presto - PullRequest
1 голос
/ 28 мая 2019

У меня есть запрос, который производит строки массивов, используя их array_agg() function

SELECT 
array_agg(message) as sequence
from mytable
group by id

, которая производит таблицу, которая выглядит следующим образом:

                 sequence
1 foo foo bar baz bar baz
2     foo bar bar bar baz
3 foo foo foo bar bar baz

но я стремлюсь сжать массив строк, чтобы ни одна не могла повторяться более одного раза подряд, например, желаемый результат будет выглядеть так:

    sequence
1 foo bar baz bar baz
2 foo bar baz
3 foo bar baz

Как можно поступить с Presto SQL?

1 Ответ

1 голос
/ 29 мая 2019

Вы можете сделать это одним из двух способов:

1) Удалите дубликаты из полученных массивов, используя функцию array_distinct:

WITH mytable(id, message) AS (VALUES
  (1, 'foo'), (1, 'foo'), (1, 'bar'), (1, 'bar'), (1, 'baz'), (1, 'baz'),
  (2, 'foo'), (2, 'bar'), (2, 'bar'), (2, 'bar'), (2, 'baz'),
  (3, 'foo'), (3, 'foo'), (3, 'foo'), (3, 'bar'), (3, 'bar'), (3, 'baz')
)
SELECT array_distinct(array_agg(message)) AS sequence
FROM mytable
GROUP BY id

2) Используйте квалификатор DISTINCT в агрегации, чтобы удалить повторяющиеся значения перед их передачей в array_agg.

WITH mytable(id, message) AS (VALUES
  (1, 'foo'), (1, 'foo'), (1, 'bar'), (1, 'bar'), (1, 'baz'), (1, 'baz'),
  (2, 'foo'), (2, 'bar'), (2, 'bar'), (2, 'bar'), (2, 'baz'), (3, 'foo'),
  (3, 'foo'), (3, 'foo'), (3, 'bar'), (3, 'bar'), (3, 'baz')
)
SELECT array_agg(DISTINCT message) AS sequence
FROM mytable
GROUP BY id

Обе альтернативы дают одинаковый результат:

    sequence
-----------------
 [foo, bar, baz]
 [foo, bar, baz]
 [foo, bar, baz]
(3 rows)
...