Как я могу получить самый последний результат из группы записей в postgresql, где соответствующие данные хранятся в виде массива JSON? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть две postgresql таблицы:

  • services, в котором есть name и description, а также внешний ключ ofsted_item_id
  • ofsted_items, в котором есть столбец inspection, содержащий массив объектов JSONB

Столбец проверки JSONB содержит данные, которые выглядят следующим образом:

[
  {"date": "2006-06-19", "judgement": "Satisfactory"}, 
  {"date": "2009-01-22", "judgement": "Satisfactory"}
]

Я хотел бы получить имя и описание из таблицы служб, а также последнее решение.

До сих пор мне удалось разбить массивы JSON на красивые, аккуратные столбцы и соедините его со второй таблицей:


SELECT
    ofsted_items.id, 
    name,
    description,
    this_inspection->>'judgement' AS judgement,
    this_inspection->>'date' AS date
FROM ofsted_items

LEFT JOIN services 
ON ofsted_items.id = services.ofsted_item_id,

LATERAL jsonb_array_elements(inspection) AS this_inspection

Это отлично работает.

Но, к сожалению, я не справляюсь с последним препятствием: я не могу найти разумный способ возвращает только самое последнее (ie. «Самое большое» значение в поле даты).

Пока что я пробовал:

  • UNIQUE
  • GROUP_BY and MAX(), который, похоже, ничего не делает, возможно, потому что поле даты JSON?

Я также рассматривал подвыборки, но с этот подход я не делаю Я вижу, как я могу на самом деле показать красиво представленные суждения из столбца JSON.

Ради вопроса, давайте предположим, что я бессилен изменить структуру данных.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Используйте distinct on. Если вам нужна одна строка на id, тогда:

SELECT DISTINCT ON (i.id) i.id, s.name, s.description,
       this_inspection->>'judgement' AS judgement,
       this_inspection->>'date' AS date
FROM ofsted_items i LEFT JOIN
     services s
     ON i.id = s.ofsted_item_id
ORDER BY i.id, this_inspection->>'date' DESC
0 голосов
/ 10 июля 2020

Используйте distinct on. Я думаю, вы хотите:

SELECT DISTINCT ON (oi.id)
    oi.id, 
    s.name,
    s.description,
    x.this_inspection ->> 'judgement' AS judgement,
    x.this_inspection ->> 'date' AS date
FROM ofsted_items oi
LEFT JOIN services s ON oi.id = s.ofsted_item_id,
LEFT JOIN LATERAL jsonb_array_elements(s.inspection) AS x(this_inspection) ON 1 = 1
ORDER BY oi.id, x.this_inspection ->> 'date' DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...