Intereting Posts
Автоматически удалять пробелы в последовательности первичных ключей Как добавить и вычесть значение из предыдущих строк на основе условия Доступ к базе данных C ++ без обязательной установки использование ввода из текстового файла для предложения WHERE простой SQL-запрос, объединить результаты и разделить Как вы получаете UTC поля datetime? Использование группы по нескольким столбцам Тип или имя пространства имен «DataSetExtensions» не существует в пространстве имен «System.Data» (вам не хватает ссылки на сборку?) Произошла ошибка при анализе запроса. Как мне обрабатывать данные «ранжированные x из y» в PostgreSQL? Как получить 5 записей до И после записи с конкретным идентификатором? Выбор частоты результата, который может отображаться в нескольких столбцах (SQL) SQLite: автоинкремент первичных ключевых вопросов SQL-код для создания новых строк на основе существующих строк Удаление дубликатов записей с использованием только одного запроса

агрегированная функция для объединения строк в Vertica

есть таблица в vertica: протестируйте вот так:

ID | name 1 | AA 2 | AB 2 | AC 3 | AD 3 | AE 3 | AF 

как я могу использовать агрегатную функцию или как написать запрос для получения таких данных (синтаксис Vertica)?

 ID | ag 1 | AA 2 | AB, AC 3 | AD, AE, AF 

Во-первых, вам нужно скомпилировать udx для agg_concatenate .

 -- Shell commands cd /opt/vertica/sdk/examples/AggregateFunctions/ g++ -D HAVE_LONG_INT_64 -I /opt/vertica/sdk/include -Wall -shared -Wno-unused-value -fPIC -o Concatenate.so Concatenate.cpp /opt/vertica/sdk/include/Vertica.cpp -- vsql commands CREATE LIBRARY AggregateFunctionsConcatenate AS '/opt/vertica/sdk/examples/AggregateFunctions/Concatenate.so'; CREATE AGGREGATE FUNCTION agg_concatenate AS LANGUAGE 'C++' NAME 'ConcatenateFactory' LIBRARY AggregateFunctionsConcatenate; 

Затем вы можете сделать запрос типа:

 select id, rtrim(agg_concatenate(name || ', '),', ') ag from mytable group by 1 order by 1 

Использует rtrim, чтобы избавиться от последнего «,».

Если вам нужно, чтобы агрегат был отсортирован определенным образом, вам может потребоваться выбрать / отсортировать его во встроенном представлении или с первого раза.

 SELECT id, MAX(DECODE(row_number, 1, a.name)) || NVL(MAX(DECODE(row_number, 2, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 3, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 4, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 5, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 6, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 7, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 8, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 9, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 10, ',' || a.name)), '')|| NVL(MAX(DECODE(row_number, 11, ',' || a.name)), '') || NVL(MAX(DECODE(row_number, 12, ',' || a.name)), '') ag FROM (SELECT id, name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) row_number FROM test) a GROUP BY a.id ORDER BY a.id; 

Другой метод – использовать GROUP_CONCAT из пакета строк в github .

 select id, group_concat(name) over (partition by id order by name) ag from mytable 

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