PostgreSQL 中聚合函数调用之间保留的行顺序

Is the order of rows preserved between aggregate function calls in PostgreSQL

给出以下示例:

create table test (
    g text,      -- group
    a integer,   -- key
    b text       -- value
)

insert into test 
select * from 
(values (1, 3, 'c'), 
        (2, 4, 'd'), 
        (2, 1, 'a'), 
        (1, 2, 'b'), 
        (2, 6, 'f'),  
        (2, 5, 'e')) as pairs (groups, num, letter)

select g, json_object(array_agg(cast (a as text)), array_agg(b)) 
from test
group by g

这段代码的结果是:

2   {"4" : "d", "1" : "a", "6" : "f", "5" : "e"}
1   {"3" : "c", "2" : "b"}

这非常适合我的目的,也就是说,键值对保留在两个 array_agg 函数调用之间。所以在我看来,这些函数以相同的顺序接收行。特定顺序对我来说并不重要,只是两个函数调用必须相同,这样 json_object 才能正确生成对。 我想知道这是有保证的还是偶然的,我不应该依赖它。另外,如果是这种情况,有什么解决方案可以达到相同的结果。

无需依赖任何隐式顺序。您可以使用 jsonb_object_agg() 函数简化查询:

select g, jsonb_object_agg(cast (a as text), b)
from test
group by g

请注意,jsonb 不保证 中 JSON 值的任何键顺序,因为键的顺序不相关。

Online example