PostgreSQL 8.4 - 带有顺序的array_agg

时间:2017-11-02 17:58:04

标签: postgresql

|id     |profile     |data
|1      |name1       |2.1
|1      |name2       |400
|1      |name3       |200
|2      |name1       |3.4
|2      |name2       |350
|2      |name3       |500

这就是我现在所拥有的。当我运行此查询时:

SELECT id, ARRAY_AGG(profile), ARRAY_AGG(data) FROM "schema"."table" GROUP BY id;

我得到了:

|id     |array(profile)           |array(data)
|1      |{name1, name2, name3}    |{2.1, 400, 200}
|2      |{name2, name3, name1}    |{350, 500, 3.4}

我也试过预先排序

SELECT id, ARRAY_AGG(profile), ARRAY_AGG(data) FROM (SELECT * FROM "schema"."table" ORDER BY id) A GROUP BY id;

两个阵列上的数据位置匹配但格式不一致。我想要这个结果:

|id     |array(profile)           |array(data)
|1      |{name1, name2, name3}    |{2.1, 400, 200}
|2      |{name1, name2, name3}    |{3.4, 350, 500}

我正在使用 PostgreSQL 8.4 ,因此我无法使用array_agg(配置文件ORDER BY数据)。

1 个答案:

答案 0 :(得分:1)

据我记得Postgres 8.4,你可以尝试在已排序的派生表上执行聚合(遗憾的是我无法运行8.4来验证这一点),例如:

select id, array_agg(profile), array_agg(data) 
from (
    select *
    from my_table
    order by id, profile) s
group by id
order by id;