Я не верю, что этот запрос делает то, что вы говорите:
SELECT DISTINCT user_id, installed_time
WHERE state=SUCCESSFUL
FROM installation
ORDER BY ASC;
Помимо очевидных синтаксических ошибок, пользователи с несколькими установками будут появляться несколько раз. Это может быть то, что вы хотите, но это не первая успешная установка.
Я думаю, что запрос должен быть:
SELECT i.user_id, MIN(i.installed_time)
FROM installation i
WHERE i.state = 'SUCCESSFUL'
GROUP BY i.user_id;
Или, если вы хотите, чтобы все столбцы в таблице, использовали DISTINCT ON
:
SELECT DISTINCT ON (i.user_id) i.*
FROM installation i
WHERE i.state = 'SUCCESSFUL'
ORDER BY i.user_id, i.installation_time
Если вам нужна действительная версия в то время, у вас есть несколько вариантов. В Postgres я бы рекомендовал боковое соединение:
SELECT i.*, v.*
FROM (SELECT i.user_id, MIN(i.installed_time) as installed_time
FROM installation i
WHERE i.state = 'SUCCESSFUL'
GROUP BY i.user_id
) i LEFT JOIN LATERAL
(SELECT v.*
FROM versions v
WHERE v.release_date <= i.installed_time
ORDER BY v.release_date DESC
FETCH FIRST 1 ROW ONLY
) v
ON 1=1;