GROUP_CONCAT Vertica中的多个字段

时间:2016-08-30 19:46:03

标签: sql vertica

我该怎么做:

SELECT ID, Store, 
           GROUP_CONCAT(keyword::VARCHAR) OVER (PARTITION BY ID, Store ORDER BY num ASC) AS keywords, 
           GROUP_CONCAT(url::VARCHAR) OVER (PARTITION BY ID, Store ORDER BY num ASC) AS urls 
FROM table_name 

运行上述查询时出现以下错误:

  

无法在SELECT列表中指定多个用户定义的转换函数

我尝试了MySQL GROUP_CONCAT multiple fields,但这似乎是MySQL的事情。我也相信GROUP_CONCAT不再支持vertica 7.1.x,所以如果有更好的方法可以做到这一点,我对此持开放态度。

3 个答案:

答案 0 :(得分:1)

由于错误状态,您在单个select语句中只能有一个UDTF,因此,为了解决此问题,可以将查询分为两个子查询并将它们连接在一起。

SELECT x.ID, x.Store, x.keywords, y.urls
FROM (
        SELECT
                ID,
                Store, 
                GROUP_CONCAT(keyword::VARCHAR) OVER (PARTITION BY ID, Store ORDER BY num ASC) AS keywords
        FROM table_name
) x
JOIN (
        SELECT
                ID, 
                GROUP_CONCAT(url::VARCHAR) OVER (PARTITION BY ID, Store ORDER BY num ASC) AS urls
        FROM table_name
) y
        ON x.ID = y.ID
;

这将分别使用其自己的GROUP_CONCAT函数评估每个查询,然后将它们结合在一起。

答案 1 :(得分:0)

您可以在Vertica github strings package找到GROUP_CONCAT。如果你的vsql路径设置正确,你应该只能makemake install

另一种方法是使用examples目录中包含的agg_concatenate。但是,您必须稍微调整sql以使串联中的顺序正确。您可以在此stackoverflow answer中查看如何执行此操作的示例。

答案 2 :(得分:-1)

您将需要以合理的CTE处理关键字和网址的转换,并将其传递给group_concat ...

    With cte_table_name AS (
    SELECT 
        ID
        ,Store
        ,keyword::VARCHAR AS keywords
        ,url::VARCHAR AS urls 
    FROM table_name 
   )
SELECT 
    t.ID    
    ,t.Store 
    ,GROUP_CONCAT(c.keyword) OVER (PARTITION BY t.ID, t.Store ORDER BY num ASC) AS keywords 
    ,GROUP_CONCAT(c.url) OVER (PARTITION BY t.ID, t.Store ORDER BY num ASC) AS urls 
FROM 
    table_name t
JOIN 
    cte_table_name c
    ON c.ID = t.ID
    AND c.Store = t.Score