Wrapping the query in a derived table is the obvious way to solve this: SELECT * FROM ( SELECT DISTINCT ON (item_id) item_id, data, timestamp, sort_order, ... FROM [this table] WHERE group_id = [some value] AND timestamp < [some value] ORDER BY item_id, timestamp DESC ) AS t ORDER BY sort_order ; If your original query is efficient and doesn't return too many rows, the additional sort will not add much cost to the query. --- Besides `DISTINCT ON`, there are a few other methods that are often more efficient in this type of "greatest-n-pre-group" queries. Most notable is using `LATERAL` subqueries. See this excellent answers by Erwin: - [Optimize `GROUP BY` query to retrieve latest record per user][1] [1]: https://stackoverflow.com/questions/25536422/optimize-group-by-query-to-retrieve-latest-record-per-user/25536748#25536748