psql:如何在分组查询后在聚合中获取单个 json 列

psql: How can I get a single json column in aggregation after a group by query

提问人:bcsta 提问时间:11/9/2023 更新时间:11/9/2023 访问量:29

问:

我正在尝试为查询中的每个 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

PostgreSQL 分组聚合 psql

评论


答:

-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