W PostgreSQL nie można używać wyrażenia z aliasem w kolejności według. Działają tam tylko zwykłe aliasy. Twoje zapytanie powinno wyglądać tak:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l.user_id = l2.user_id desc;
Zakładam, że masz na myśli, że l2.user_id=l.user_id
powinien iść pierwszy.
Jest to istotna wiadomość na ogólnej liście dyskusyjnej PostgreSQL. Poniżej znajduje się dokumentacja ORDER BY
klauzula:
Każde wyrażenie może być liczbą porządkową nazwy kolumny wyjściowej (WYBIERZ element listy) lub może to być dowolne wyrażenie utworzone z kolumny wejściowej wartości .
Więc bez aliasów, gdy używane jest wyrażenie.