Postgres JSONB Выберите по VersionNumber, верните только последние - PullRequest
0 голосов
/ 03 мая 2020

Пример данных:

VersionNumber, Label
1, Apple
2, Apple
3, Apple
1, Orange

Что мне нравится делать:

Мне нравится возвращать только 3, Apple и 1, Orange

select elem -> 'VersionNumber' as VersionNumber, elem-> 'Label' as Label
from transaction o , lateral jsonb_array_elements(fruits -> 'records') elem
group by VersionNumber, Label

Я пробовал выше, но я не уверен, как получить только последний VersionNumber

1 Ответ

0 голосов
/ 03 мая 2020

Прежде всего, кажется, у вас есть столбец типа jsonb fruits в таблице как

{ "records": [ 
             { "VersionNumber": 1, "Label": "Apple" },
             { "VersionNumber": 2, "Label": "Apple" },
             { "VersionNumber": 3, "Label": "Apple" },
             { "VersionNumber": 1, "Label": "Orange" }
        ] }

Тогда вы на полпути. Необходима только функция windows analyti c (например, RANK()), поскольку она разделена по столбцу Labels, а в порядке убывания по столбцу VersionNumber -

SELECT VersionNumber, Label 
  FROM
  (
   SELECT elem -> 'VersionNumber' as VersionNumber, elem->> 'Label' as Label,
          RANK() OVER (PARTITION BY elem-> 'Label'
                       ORDER BY elem-> 'Label', elem -> 'VersionNumber' DESC) AS rnk
     FROM transaction 
     JOIN LATERAL jsonb_array_elements(fruits -> 'records') elem
       ON TRUE
   ) q
  WHERE q.rnk = 1

Demo

...