簡體   English   中英

在Postgresql的JSONB對象數組中查找具有最高值的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM