2016-06-20 11 views
3
は、我々はこのようなデータに何かがあるとし

GROUP_CONCATが

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をサポートしていますが、私が原因あなたがコンパイルされ、sdk/examplesディレクトリ内の関数を作成したと仮定すると、OVER句と必須パーティショニング

+0

なぜ、日付でグループ化するだけの場合はOVER句が必要ですか? –

+0

いずれの場合もGROUP_CONCATはOVER句を必要とするため –

答えて

3

に適切なクエリを作ることができない、あなたが行うことができるはず:

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

私はこの方法は、単に個別のデータを照会し、最後にそれらを組み合わせてくださいすることです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)