Intereting Posts
Как проверить, хорошо ли INSERT хранится функция? В ABAP Workbench, как заставить программу возвращать несколько табличных полей в таблицу при нажатии кнопки? Команда DELETE слишком медленная в таблице с кластеризованным индексом Использование DISTINCT и COUNT вместе в запросе MySQL Почему Postgres не использует индекс? MySQL уникальное кластерное ограничение, не ограничивающее ожидаемое Социальные сети и сетевые подключения Каков синтаксис внутреннего соединения в LINQ to SQL? В чем разница между первичным ключом и уникальным ограничением? Консоль MySQL замедляет импорт огромных файлов SQL Самый чистый способ создания строки SQL в Java Справка MySQL JOIN query: возвращает только одну строку из самой правой таблицы для каждой строки в самой левой таблице Как отклонить инструкцию delete до запуска триггера? Как работают составные индексы? Будет ли использовать подсказки TABLOCK и HOLDLOCK в SQL Server 2005 ПОЛНОСТЬЮ предотвращать вставки до конца транзакции?

Concat GROUP BY в Vertica SQL

Мне нужно получить список идентификаторов, разделенных запятыми, как поле для грязной сторонней api: s Это упрощенная версия того, чего я пытаюсь достичь.

| id | name | |====|======| | 01 | greg | | 02 | paul | | 03 | greg | | 04 | greg | | 05 | paul | SELECT name, {some concentration function} AS ids FROM table GROUP BY name 

возврате

 | name | ids | |======|============| | greg | 01, 03, 04 | | paul | 02, 05 | 

Я знаю, что MySQL имеет функцию CONCAT_GROUP, и я надеялся решить эту проблему, не устанавливая больше функций из-за среды. Может быть, я могу решить эту проблему, используя инструкцию OVER?

Самый простой в долгосрочной перспективе – использовать один из официальных Vertica UDF, который можно найти на github по адресу https://github.com/vertica/Vertica-Extension-Packages/tree/master/strings_package, который предоставляет функцию group_concat. Процедура установки должна быть найдена в README, и примеры даже предоставляются.

Вам нужно будет использовать OVER() с NVL() (вам потребуется расширить конкатенацию более чем на 10 экземпляров на имя):

 CREATE TABLE t1 ( id int, name varchar(10) ); INSERT INTO t1 SELECT 1 AS id, 'greg' AS name UNION ALL SELECT 2, 'paul' UNION ALL SELECT 3, 'greg' UNION ALL SELECT 4, 'greg' UNION ALL SELECT 5, 'paul'; COMMIT; SELECT name, MAX(DECODE(row_number, 1, a.id)) || NVL(MAX(DECODE(row_number, 2, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 3, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 4, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 5, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 6, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 7, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 8, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 9, ',' || a.id)), '') || NVL(MAX(DECODE(row_number, 10, ',' || a.id)), '') id FROM (SELECT name, id, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) row_number FROM t1) a GROUP BY a.name ORDER BY a.name; 

результат

  имя |  Я бы
 ------ + -------
  greg |  1,3,4
  paul |  2,5 

Посмотрите на Concatenate UDAF в примерах vertica, которые поставляются с установкой Vertica, которая является эквивалентом mysql. вы можете просто установить его прямо.

больше /opt/vertica/sdk/examples/AggregateFunctions/Concatenate.cpp

 -- Shell comppile 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 -- Create LIBRARY CREATE LIBRARY AggregateFunctionsConcatenate AS '/opt/vertica/sdk/examples/AggregateFunctions/Concatenate.so'; CREATE AGGREGATE FUNCTION agg_group_concat AS LANGUAGE 'C++' NAME 'ConcatenateFactory' LIBRARY AggregateFunctionsConcatenate; in the Concatenate.cpp replace : input_len*10 with : 65000 

есть два места, которые вы должны заменить этим значением в коде.

65000 – это максимальная длина, которую вы можете получить с помощью varchar. и поскольку vertica не использует все 65000 для значений меньше 65000 символов, вы в порядке.