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 值的任何键顺序,因为键的顺序不相关。
给出以下示例:
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 值的任何键顺序,因为键的顺序不相关。