[英]Find object having the highest value in JSONB array of objects in Postgresql
假設我們有一個表,其中列data
存儲了一個對象數組。
┌────┬───────────────────────────────────────────────────────────────────────┐
│ id │ data │
├────┼───────────────────────────────────────────────────────────────────────┤
│ 1 │ [{"m2": 40.0, "sector": "Office"}, {"m2": 65.0, "room": "Hospital"}] │
│ 2 │ [{"m2": 25.0, "sector": "Cafe"}, {"m2": 120.0, "room": "Office"}] │
│ 3 │ [] │
└────┴───────────────────────────────────────────────────────────────────────┘
我只想找到m2
值最高的這些對象。
┌────┬─────────────────────────────────────────┐
│ id │ data │
├────┼─────────────────────────────────────────┤
│ 1 │ {"m2": 65.0, "room": "Hospital"} │
│ 2 │ {"m2": 120.0, "room": "Office"} │
│ 3 │ null │
└────┴─────────────────────────────────────────┘
PostgreSQL 13.4
在使用row_number
確定具有最高m2
值的對象之前,您可以嘗試以下使用json_array_elements
擴展數組的方法。
select
"id",
(
SELECT
jr
FROM (
SELECT
jr,
ROW_NUMBER() OVER (
ORDER BY jr->'m2' DESC
) as rn
FROM
jsonb_array_elements("data") as jr
) t1
WHERE rn=1
) as "data"
from
my_table
讓我知道這是否適合您。
您可以使用子查詢:
with m_d(id, a) as (
select t1.id, (select json_agg(v.value) from jsonb_array_elements(t1.data::jsonb) v
where (v.value -> 'm2')::text::float = (select max((v2.value -> 'm2')::text::float)
from jsonb_array_elements(t1.data::jsonb) v2)) from t t1
)
select id, case when json_array_length(a) = 0 then null else a ->> 0 end from m_d;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.