Я еще не проверял это, поэтому вам, возможно, придется настроить его:
SELECT
TD1.client_id,
TD1.id,
TD1.description,
TD1.timestamp_due
FROM
Todos TD1
LEFT OUTER JOIN Todos TD2 ON
TD2.client_id = TD1.client_id AND
TD2.timestamp_completed IS NULL AND
(
TD2.timestamp_due < TD1.timestamp_due OR
(TD2.timestamp_due = TD1.timestamp_due AND TD2.id < TD1.id)
)
WHERE
TD2.id IS NULL
Вместо того, чтобы пытаться сортировать и агрегировать, вы в основном отвечаете на вопрос: "Есть ли еще какие-нибудь задачи, которые могут возникнуть до этого?" (на основе вашего определения «до»). Если нет, то это тот, который вы хотите.
Это должно быть допустимо на большинстве платформ SQL.