将键列和多个值列聚合为 JSON 对象

xeh*_*puk 2 postgresql json aggregate-functions

我有这张表:

CREATE TABLE my_table (
    id uuid PRIMARY KEY,
    name text NOT NULL,
    key text NOT NULL,
    x int NOT NULL,
    y int NOT NULL,
    UNIQUE (name, key)
);
Run Code Online (Sandbox Code Playgroud)

有了这个数据:

id 名称 键 xy
12345678-abcd-1234-abcd-123456789000 富一 1 2
12345678-abcd-1234-abcd-123456789001 富 b 3 4
12345678-abcd-1234-abcd-123456789002 富c 5 6
12345678-abcd-1234-abcd-123456789003 富德 7 8
12345678-abcd-1234-abcd-123456789004 条 v 0 0
12345678-abcd-1234-abcd-123456789005 酒吧 w 1 1
12345678-abcd-1234-abcd-123456789006 巴 z 2 2
12345678-abcd-1234-abcd-123456789007 巴兹 8 7
12345678-abcd-1234-abcd-123456789008 巴兹 b 6 5
12345678-abcd-1234-abcd-123456789009 巴兹 c 4 3
12345678-abcd-1234-abcd-123456789010 巴兹 d 2 1

我有这样的疑问:

SELECT name, json_build_object(key, json_build_object('x', x, 'y', y))
FROM my_table;
Run Code Online (Sandbox Code Playgroud)

得到这个结果:

名称 json_build_object
foo {“a”:{“x”:1,“y”:2}}
foo {“b”:{“x”:3,“y”:4}}
foo {“c”:{“x”:5,“y”:6}}
foo {“d”:{“x”:7,“y”:8}}
条形图 {"v": {"x": 0, "y": 0}}
条形图{“w”:{“x”:1,“y”:1}}
条{“z”:{“x”:2,“y”:2}}
巴兹 {“a”:{“x”:8,“y”:7}}
巴兹 {“b”:{“x”:6,“y”:5}}
巴兹 {“c”:{“x”:4,“y”:3}}
巴兹 {“d”:{“x”:2,“y”:1}}

我想要什么:

foo {“a”:{“x”:1,“y”:2},“b”:{“x”:3,“y”:4},“c”:{“x”:5,“ y”:6},“d”:{“x”:7,“y”:8}}
条形图{“v”:{“x”:0,“y”:0},“w”:{“x”:1,“y”:1},“z”:{“x”:2,“ y": 2}}
baz {“a”:{“x”:8,“y”:7},“b”:{“x”:6,“y”:5},“c”:{“x”:4,“ y”:3},“d”:{“x”:2,“y”:1}}

我知道我需要GROUP BY name聚合其他列,但找不到合适的组合。这甚至可以通过单个查询实现吗?functions

S-M*_*Man 5

您的查询应该是:

SELECT 
    name, 
    json_object_agg(key, json_build_object('x', x, 'y', y)) 
FROM data
GROUP BY name
Run Code Online (Sandbox Code Playgroud)

演示:db<>小提琴

json_object_agg正是你想要的。