Упорядочить таблицу по ключу в массиве json (хранится как jsonb) в Postgres - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть postgres, в котором есть столбец jsonb, который является массивом jsons.

id  array_json
123 [{"end_time": 22, "start_time": 21}]
124 [{"end_time": 22, "start_time": 9}, {"end_time": 20, "start_time": 0}]
126 [{"end_time": 22, "start_time": 0}]
125 [{"end_time": 22, "start_time": 1}, {"end_time": 20, "start_time": 6}]

Я хочу заказать их по "start_time". В строке есть массив jsons. В таких случаях порядок должен учитывать самое раннее время начала во всем массиве. Если два массива имеют одинаковое время начала, не имеет значения, какой из них будет первым. Окончательный результат должен быть:

id  array_json
126 [{"end_time": 22, "start_time": 0}]
124 [{"end_time": 22, "start_time": 9}, {"end_time": 20, "start_time": 0}]
125 [{"end_time": 22, "start_time": 1}, {"end_time": 20, "start_time": 6}]
123 [{"end_time": 22, "start_time": 21}]

Я создал скрипку этой таблицы. Как это сделать?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Это будет работать, я думаю:

select id, array_json from the_table,
lateral (select min((d->>'start_time')::int) x from jsonb_array_elements(array_json) d) t(x)
order by x

С уважением,
Bjarni

0 голосов
/ 16 февраля 2020

Этот запрос можно использовать:

select id, min(start_time) min_start_time, array_json 
from (
   select 
       id, 
       array_json,
       -- we must convert start_time to integer for right sort order
       (jsonb_array_elements(array_json)->>'start_time')::int4 as start_time
    from the_table
) tmp 
group by id, array_json
order by min_start_time;
...