2016-12-20 8 views
2

私はテーブルtをpostgresデータベースに持っています。jsonbデータを含むpostgres sqlカラムの最小値の検索方法は?

20161214が日付である
{ 
    "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"] } 
} 

"4"642の量は、月 - それは(レコードごとに)次のフォーマットでjsonbデータを含む列dataを有しています。

テーブルの各レコードの最小金額とその金額が属する月を見つける必要があります。

がjsonb_each機能を使うと、キーと値のペアを分離して、まだ私はそれが属する月を取得カント分function.Butを使用して:私が試してみました何

これはどのように達成できますか? (加入無し)また

+0

は**常に**配列の3番目の要素量ですか? –

+0

私はあなたに2つの解決策を書いたので、正確な要求が何であるかを確認していますので、見てみてください。 –

+0

はい、量は常に3番目の要素です。 –

答えて

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

制限なしでクエリを実行 –

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; 
関連する問題