aggregate function to concatenate strings in Vertica

前端 未结 3 687
礼貌的吻别
礼貌的吻别 2021-01-13 02:43

have a table in vertica: test like this:

ID     |   name
1      |    AA
2      |    AB
2      |    AC
3      |    AD
3      |    AE
3      |    AF

相关标签:
3条回答
  • 2021-01-13 03:01
    SELECT id,
        MAX(DECODE(row_number, 1, a.name)) ||
        NVL(MAX(DECODE(row_number, 2, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 3, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 4, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 5, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 6, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 7, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 8, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 9, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 10, ',' || a.name)), '')||
        NVL(MAX(DECODE(row_number, 11, ',' || a.name)), '') ||
        NVL(MAX(DECODE(row_number, 12, ',' || a.name)), '') ag
    FROM
        (SELECT id, name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) row_number FROM test) a
    GROUP BY a.id
    ORDER BY a.id;
    
    0 讨论(0)
  • 2021-01-13 03:09

    First, you'll need to compile the udx for agg_concatenate.

    -- 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;
    

    Then you can do a query like:

    select id, rtrim(agg_concatenate(name || ', '),', ') ag
    from mytable
    group by 1
    order by 1
    

    Uses rtrim to get rid of the last ', '.

    If you need the aggregate to be sorted a certain way, you may need to select/sort in an inline view or with first.

    0 讨论(0)
  • 2021-01-13 03:09

    The other method is to use GROUP_CONCAT from the strings package on github.

    select id, group_concat(name) over (partition by id order by name) ag
    from mytable
    

    However there are some limitations with this method since analytical udx won't allow you to include other aggregates (and you'll have to inline it or use with to add more data to it).

    0 讨论(0)
提交回复
热议问题