SQL组由distinct数组组成

时间:2016-03-16 10:54:08

标签: postgresql

我有table1

col1 (integer)  |  col2 (varchar[]) | col3 (integer)    
----------------------------------------------------
    1           |  {A,B,C}          | 2
    1           |  {A}              | 5
    1           |  {A,B}            | 1
    2           |  {A,B}            | 2
    2           |  {A}              | 3
    2           |  {B}              | 1

我想总结一下' col3'与GROUP BY' col1'只保留' col3'

中的DISTINCT值

预期结果如下:

col1 (integer)  |  col2 (varchar[]) | col3 (integer)    
----------------------------------------------------
    1           |  {A,B,C}          | 8
    2           |  {A,B}            | 6

我试过了:

SELECT col1, array_to_string(array_accum(col2), ','::text),sum(col3) FROM table1 GROUP BY col1

但结果不是预期的结果:

col1 (integer)  |  col2 (varchar[])       | col3 (integer)    
---------------------------------------------------------------
    1           |  {A,B,C,A,A,B}          | 8
    2           |  {A,B,A,B}              | 6
你有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果您想要的col2逻辑最大(如预期输出中{A,B,C}& {A,B}

SELECT col1, (SELECT sub.col2 
              FROM table1 sub
              INNER JOIN table1 sub ON MAX(char_length(sub.col2)) = col2
              WHERE sub.col1 = col1)
       SUM(col3) 
FROM table1 
GROUP BY col1

答案 1 :(得分:0)

SELECT 
col1, 
array_to_string(array_accum(col2), ','::text),
sum(col3) 
FROM table1 
GROUP BY col1;

但是array_to_string使用提供的分隔符和可选的空字符串连接数组元素。

您必须设计一个不同的策略,例如使用array_dims(anyarray)来选择具有max元素的数组,或者创建一个新的聚合函数。

为此你可能对这个答案感兴趣:

eliminate duplicate array values in postgres