在 Vertica SQL 中连接 GROUP BY

问题描述 投票:0回答:3

我需要获取一个以逗号分隔的 ids 列表,作为混乱的第三方 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 语句解决这个问题?

sql vertica
3个回答
9
投票

您必须将

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;

结果

 姓名 | ID
------+--------
 格雷格 | 1,3,4
 保罗 | 2,5

4
投票

查看 vertica 安装附带的 Concatenate UDAF in 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 个字符的值,所以没问题。


2
投票

从长远来看,最简单的方法是使用 github 上的官方 Vertica UDF 之一,网址为 https://github.com/vertica/Vertica-Extension-Packages/tree/master/strings_package,它提供了 group_concat 函数。安装过程可以在README中找到,甚至还提供了示例。

© www.soinside.com 2019 - 2024. All rights reserved.