Vertica中的GROUP_CONCAT

4
假设我们有这样的数据:
    date    | campaign | raw | unq 
------------+----------+-----+-----
 2016-06-01 | camp1    |   5 |   1
 2016-06-01 | camp2    |  10 |   1
 2016-06-01 | camp3    |  15 |   2
 2016-06-02 | camp4    |   5 |   3
 2016-06-02 | camp1    |   5 |   1

我需要按照某种方式对其进行分组,以获得以下结果:
    date    | campaigns           | raw  | unq 
------------+---------------------+----- +-----
 2016-06-01 | camp1, camp2, camp3 |   30 |   4
 2016-06-02 | camp4, camp1        |   10 |   4

为此,Mysql提供了GROUP_CONCAT函数。Vertica也支持GROUP_CONCAT,但由于OVER子句和强制分区,我无法编写正确的查询语句。


如果你只按日期分组,为什么需要使用OVER子句? - Little Bobby Tables
由于在任何情况下GROUP_CONCAT都需要一个OVER子句。 - Vadim Kasich
3个回答

3
假设您已经在 sdk/examples 目录中编译并创建了该函数,您应该能够执行以下操作:
select date, sum(raw) "raw", sum(unq) unq, rtrim(agg_concatenate(campaign || ', '),', ')
from mytest
group by 1
order by 1

我使用rtrim来移除最后一个', '。
如果您还没有创建它,可以这样做:
-- 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;

1

链接所述:

Vertica 9.1.1-4现在有一个名为LISTAGG的内置函数,可以执行相同的操作...

使用"LISTAGG"


1
我所知道的使用group_concat的唯一方法就是分别查询数据并在最后进行组合。虽然这种方法不太美观,但对于你的问题来说,这是更直接的答案。
with camps as (
  select date, group_concat(campaign) over (partition by date) campaigns
  from mytest
), sums as (
  select date, sum(raw) "raw", sum(unq) unq
  from mytest
  group by date
)
select c.date, "raw", unq, campaigns
from camps c
join sums s on (c.date = s.date)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接