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

How to find the minimum value in a jsonb data using postgres?

我有这个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 中有 table 函数,return 一组行的函数,如 jsonb_each()。您应该在 FROM 列表中使用这些函数。这些 table 函数可以隐式引用列表中前面定义的 table 中的列,例如 FROM my_table, jsonb_each(my_table.data),在这种情况下,两个源之间的 link 就好像两者之间指定了连接条件;实际上,对于源 table 的每一行都会调用一次该函数,并将函数输出添加到可用列的列表中。

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

我为此创建了这个函数。希望对你有帮助

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;