No PostgreSQL você não pode usar expressão com um alias na ordem. Apenas aliases simples funcionam lá. Sua consulta deve ficar assim:
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;
Suponho que você queira dizer que
l2.user_id=l.user_id
deveria ir primeiro. Esta é uma mensagem relevante na lista de discussão geral do PostgreSQL. O seguinte está na documentação de
ORDER BY
cláusula:
Cada expressão pode ser o nome ou número ordinal de uma coluna de saída (SELECT item de lista), ou pode ser uma expressão arbitrária formada a partir de coluna de entrada valores .
Portanto, não há aliases quando a expressão é usada.