提问人:bcsta 提问时间:11/9/2023 更新时间:11/9/2023 访问量:29
psql:如何在分组查询后在聚合中获取单个 json 列
psql: How can I get a single json column in aggregation after a group by query
问:
我正在尝试为查询中的每个 group by 子句获取一行。每个 SELECT 输出中都有一个 json。我正在尝试这个:
SELECT MIN(C.json_column->'key') AS Key, A.field1, B.field2
FROM json_table AS C
LEFT JOIN another_table AS D ON D.id=C.id
INNER JOIN another_table2 AS A ON A.id=D.col2
INNER JOIN another_table3 AS B on B.id=D.col3
GROUP BY (A.field1, B.field2)
连接在这里无关紧要。问题是正在返回:MIN(C.json_column->'key')
No function matches the given name and argument types. You might need to add explicit type casts.
由于我按其他 2 个字段分组,因此我必须聚合 json 字段。但我只想要第一个(或任何其他)单个 json 行。 似乎不适用于 JSON 类型。我能用什么?MIN
答:
-1赞
SelVazi
11/9/2023
#1
运算符 ->
以 JSON 形式返回 JSON 元素,而是将 JSON 元素作为文本返回,然后将其转换为整数:->>
SELECT MIN((C.json_column->>'key')::int) AS Key, A.field1, B.field2
FROM json_table AS C
LEFT JOIN another_table AS D ON D.id=C.id
INNER JOIN another_table2 AS A ON A.id=D.col2
INNER JOIN another_table3 AS B on B.id=D.col3
GROUP BY (A.field1, B.field2)
0赞
Zegarek
11/9/2023
#2
您正在寻找一种独特的结构
。db<>fiddle 演示:
SELECT DISTINCT ON(A.field1, B.field2)
C.json_column->'key' AS Key, A.field1, B.field2
FROM json_table AS C
LEFT JOIN another_table AS D ON D.id=C.id
INNER JOIN another_table2 AS A ON A.id=D.col2
INNER JOIN another_table3 AS B on B.id=D.col3
ORDER BY A.field1, B.field2
这将为每对唯一的一对选择一个,丢弃其余的。对于这种情况,/ 聚合解决方法的工作方式相同,但通常用途更广:随着列的增加,聚合会很快失去单独对每个辅助列进行排序的性能,并且它们还会生成不存在的值组合,而不是组中的真实样本。json_column
(A.field1, B.field2)
min()
max()
distinct on
评论