Порядок не имеет отношения к окончательному результату, потому что он применяется только к оператору SELECT, в котором он используется, то есть к вашему подзапросу. Затем вы выполняете другой запрос для этих результатов, используя DISTINCT ON
, который будет выполнять любые вычисления и возвращать вам результаты в некотором порядке, но, вероятно, не тот, который вам нужен.
Чтобы разрешить заказ во внешнем запросе, поля, которые вы хотите использовать в заказе, должны быть доступны на этом уровне. Это означает, что подзапрос также должен возвращать поле метки времени, тогда внешний запрос может упорядочить его, но не выбирать его (чтобы сохранить возвращаемые столбцы такими же).
select
DISTINCT ON (doc_id)
doc_id, comments
FROM (
select d.doc_id, c.comments, (c.comments ->>'timestamp')::timestamp AS comment_timestamp
from documents as d
cross join lateral jsonb_array_elements(comments)
WITH ORDINALITY c(comments)
WHERE (c.comments ->> 'isUser'):: boolean is false
) as s
ORDER BY doc_id, comment_timestamp DESC
Возможно, я что-то упускаю, но, похоже, вам все равно не нужен подзапрос, разве это не сработает?
select DISTINCT ON (d.doc_id) d.doc_id, c.comments
from documents as d
cross join lateral jsonb_array_elements(comments)
WITH ORDINALITY c(comments)
WHERE (c.comments ->> 'isUser'):: boolean is false
order by d.doc_id, (c.comments ->>'timestamp')::timestamp desc