json - 如何使用 postgres 在 jsonb 数据中找到最小值?

标签 json postgresql jsonb

我有这个 jsonb 数据格式-

data

{"20161110" : {"6" : ["12", "11", "171.00"],"12" : ["13", "11", "170.00"],"18" : ["16", "11", "174.00"]}}

我想从价格中找出最小值, 在本例中为 170.00 。 我已尝试编制索引,但能够找到特定术语 (6、12、18) 的数据,但不是其中的最小值。

What I have tried-

data::json->(select key from json_each_text(data::json) limit 1))::json#>>'{6,2}'

第 6 学期的结果是 171.00

最佳答案

如果您想要数组中第三个元素的最小值,那么您将不得不解压 JSON 文档以获取数组以比较值。这有点像这样(假设您确实有一个 jsonb 列和一个名为 id 的主键):

SELECT id, min((arr ->> 2)::numeric) AS min_price
FROM ( SELECT id, jdoc
       FROM my_table, jsonb_each(data) d (key, jdoc) ) sub,
     jsonb_each(jdoc) doc (key, arr)
GROUP BY 1;

在 PostgreSQL 中有表函数,返回一组行的函数,如 jsonb_each()。您应该在 FROM 列表中使用这些函数。这些表函数可以隐式引用列表中前面定义的表中的列,例如 FROM my_table, jsonb_each(my_table.data),在这种情况下,两个源之间的链接就像连接条件一样在两者之间指定;实际上,该函数会针对源表的每一行调用一次,并将函数输出添加到可用列的列表中。

JSON 函数仅适用于明确指定的 JSON 文档级别。这可能是整个文档(在本例中为 my_table.data)或向下到您可以指定的某个路径。我在这里假设第一个键是日期值,因此您事先不知道该键。子文档也是如此。在这些情况下,您可以使用 jsonb_each() 等函数。您显然知道确切的数组位置,因此您只需索引数组即可找到价格信息。请注意,这些显然也是 JSON 格式,因此您应该使用 ->> 运算符将价格作为 text 值,然后将其转换为 numeric 这样您就可以将它提供给 min() 函数。

关于json - 如何使用 postgres 在 jsonb 数据中找到最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603600/

相关文章:

postgresql - 如何仅从 postgres 获取特定键的 jsonb?

json - Postgresql 9.4 - 转换为 JSONB 时输入语法无效

javascript - Backbone.js - 将变量从路由传递到 View /集合/模型

python - Django 过滤、分页和注释分页结果

postgresql - 在 Qgis 或 Postgres 中合并不相邻的多边形

postgresql - 在 hot_standby 设置上通过 pglogical 进行复制

javascript - 如何制定 for 循环代码以在特定 html 表格单元格中插入值?

java - 在Google App Engine java中使用ajax获取Json数据

ios - 如何在 Swift 2.0 中从数组内部的数组中提取 JSON 数据

sequelize.js - Sequelize 更新 JSONB 中的嵌套属性