Postgres порядок записей по идентификатору, идентификатору собственной ссылки и дате, после каждого родителя, список потомков - PullRequest
2 голосов
/ 26 марта 2020

У меня есть таблица orders со следующими полями id, updated_at, self_ref_id и другими, которые не учитываются.
Столбец self_ref_id является самостоятельной ссылкой на два порядка, у одного заказа может быть несколько детей, у ребенка не будет других детей.
Я пытаюсь упорядочить все записи по updated_at desc, но после каждого родительского заказа я хочу, чтобы его дети, также заказанные по updated_at, даже хотя ребенок updated_at ниже, чем следующий родитель updated_at.

Я пытался упорядочить их по updated_at и сгруппировать по id и self_ref_id.

Я использую go с Гормом, если это считается, но мне нужно подсказка, как сделать этот запрос. Я также пытался с подзапросом, но мне не удалось. Мне не нужны повторяющиеся поля, я просто хочу их упорядочить.

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

1 Ответ

1 голос
/ 26 марта 2020

Вы можете сделать это с помощью самостоятельного соединения:

select o.*
from orders o
left join orders p on p.id = o.self_ref_id
order by 
    coalesce(p.updated_at, o.updated_at), 
    p.id is not null,
    o.updated_at

left join связывает родительскую строку, если таковая имеется. Затем мы упорядочиваем по родительской дате (или текущей дате, если родительской даты нет); второй критерий упорядочения (p.id is not null) отдает приоритет «родительской» строке, а последний критерий упорядочивает дочерние строки по дате.

...