Vertica SQL中的Concat GROUP BY

Vertica SQL中的Concat GROUP BY,sql,vertica,Sql,Vertica,我需要得到一个逗号分隔的ID列表作为混乱的第三方api的字段:这是我试图实现的简化版本 | 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 | |=====

我需要得到一个逗号分隔的ID列表作为混乱的第三方api的字段:这是我试图实现的简化版本

| 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语句解决这个问题?

您必须使用with(您必须为每个名称扩展超过10个实例的连接):

结果

name | id ------+------- greg | 1,3,4 paul | 2,5 姓名| id ------+------- 格雷格| 1,3,4
paul | 2,5从长远来看,最简单的方法是使用github上的官方Vertica UDF之一,该UDF提供了group|u concat功能。安装过程可以在自述文件中找到,甚至还提供了示例。

请查看vertica安装附带的vertica示例中的Concatenate UDAF 这就是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个字符的值,所以您可以。

如果我没有弄错的话,vertica是Postgres fork。因此,那里可能有
string\u agg
array\u agg
。@一匹没有名字的马不幸也没有。这似乎是一个很好的现实解决方案@Gregology,有没有可能需要它是任意长度的连接?连接不能使用分隔符,正如:和Guillaume的回答中所述,您必须使用第三部分UDF,它可以this@user1084563这很好,只需执行
rtrim(agg\u group\u concat(字段| |','),',',')
。rtrim将在最后删除分隔符,并且此方法不需要分析函数。@woot有趣的解决方法,肯定没有意识到可以在函数调用中附加这样的内容。您可能还想将其添加到我发布的vertica社区线程中,因为那里没有建议这样做。@user1084563
-- 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