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

时间:2016-11-15 06:40:49

标签: json postgresql jsonb

我有这种jsonb数据格式 -

  

数据

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

我想找出价格中的最小值, 在这种情况下 - 170.00。 我尝试过索引,但能够找到特定术语的数据(6,12,18),但不是最小的数据。

  

我尝试了什么 -

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

这给了我第六个学期的结果,即171.00

2 个答案:

答案 0 :(得分:1)

如果您想要数组中第三个元素的最小值,那么您必须解压缩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() {1}}功能。

答案 1 :(得分:0)

我为此创建了此功能。希望对您有帮助

CREATE 
OR 
replace FUNCTION min_json (data json) 
returns numeric AS $$ 
BEGIN
RETURN 
  ( 
         SELECT Min(value) 
         FROM   ( 
                       SELECT (Hstore(Json_each_text(data))->'value')::numeric AS value) AS t);
END;
$$ language plpgsql;