2016-12-20 58 views
2

我在postgres數據庫中有一個表t。它具有包含以下格式jsonb數據(對於每個記錄)的柱data -如何在包含jsonb數據的postgres sql列中查找最小值?

{ 
    "20161214": {"4": ["3-14", "5-16", "642"], "9": ["3-10", "5-10", "664"] }, 
    "20161217": {"3": ["3-14", "5-16", "643"], "7": ["3-10", "5-10", "661"] } 
} 

其中20161214是日期,"4"是月,642是量。

我需要找到表格的每個記錄和金額屬於的月份的最小金額。

我曾嘗試:

使用jsonb_each功能和分離鍵值對,然後使用分鐘function.But我仍然不能得到它所屬的月份。

這是如何實現的?

+0

是對量** **總是陣列中的第三元件? –

+0

我記下確切的要求是什麼,所以我給你寫了2個解決方案,請看看它們是否合適。 –

+0

是的,金額始終是第三個要素。 –

回答

1
select j2.date 
     ,j2.month 
     ,j2.amount 

from t 

     left join lateral 

      (select  j1.date 
         ,j2.month 
         ,(j2.value->>2)::numeric as amount 

      from  jsonb_each (t.data) j1 (date,value) 

         left join lateral jsonb_each (j1.value) j2 (month,value) 
         on true 

      order by amount 

      limit  1 
      ) j2 

     on true 

+----------+-------+--------+ 
| date  | month | amount | 
+----------+-------+--------+ 
| 20161214 | 4  | 642 | 
+----------+-------+--------+ 
+0

這就是我需要的,非常感謝Dudu! –

+0

你能解釋一下我的查詢嗎?爲什麼使用某些東西,比如限制1 –

+1

執行沒有限制的查詢 –

0

可選地(無連接):

select 
    min(case when amount = min_amount then month end) as month, 
    min_amount as amout 
from (
    select 
     key as month, 
     (select min((value->>2)::int) from jsonb_each(value)) as amount, 
     min((select min((value->>2)::int) from jsonb_each(value))) over(partition by rnum) as min_amount, 
     rnum 
    from (
     select 
      (jsonb_each(data)).*, 
      row_number() over() as rnum 
     from t 
    ) t 
) t 
group by 
    rnum, min_amount; 
相關問題