2017-08-08 53 views
0

我有以下的表有三列:根据第三列的值,我如何在一列中进行聚合?

id | type | value 
-----+------+------- 
foo | bar | 123 
foo | bar | 456 
foo | biz | 789 
foo | biz | 987 
baz | bar | 555 
quz | biz | 777 

我试图在给定type聚集value,返回这样的结果:

id |  bar  | biz 
-----+---------------+----------- 
foo | {123,456}  | {789,987} 
baz | {555}   | {} 
quz | {}   | {777} 

我到目前为止已经试过自动加入表格两次(使用LEFT JOIN来计算空列),然后执行DISTINCT以在汇总之前删除重复项。有没有更好的办法?

目前查询:

SELECT 
    test.id, 
    ARRAY_REMOVE(ARRAY_AGG(DISTINCT(t1.value)), NULL) AS bar, 
    ARRAY_REMOVE(ARRAY_AGG(DISTINCT(t2.value)), NULL) AS biz 
FROM test 
LEFT JOIN test t1 ON test.id = t1.id AND t1.type = 'bar' 
LEFT JOIN test t2 ON test.id = t2.id AND t2.type = 'biz' 
GROUP BY test.id; 

回答

1

尝试:

SELECT id, 
     ARRAY_REMOVE(Array_agg(bar), NULL) as bbar, 
     ARRAY_REMOVE(Array_agg(biz), NULL) as bbiz 
FROM (
    SELECT id, 
    CASE WHEN type = 'bar' THEN value ELSE NULL END AS bar, 
    CASE WHEN type = 'biz' THEN value ELSE NULL END AS biz 
    FROM test 
) x 
GROUP BY id 
相关问题