A documentação diz:
DISTINCT ON (expressão [, ...]) mantém apenas a primeira linha de cada conjunto de linhas em que as expressões dadas são avaliadas como iguais. [...] Observe que a "primeira linha" de cada conjunto é imprevisível, a menos que ORDER BY seja usado para garantir que a linha desejada apareça primeiro. [...] As expressões DISTINCT ON devem corresponder às expressões ORDER BY mais à esquerda.
Documentação oficial
Então você terá que adicionar o address_id
ao pedido por.
Como alternativa, se você estiver procurando a linha completa que contém o produto comprado mais recente para cada um address_id
e o resultado classificado porpurchased_at
então está tentando resolver o maior problema de N por grupo que pode ser resolvido pelas seguintes abordagens:
A solução geral que deve funcionar na maioria dos DBMSs:
SELECT t1.* FROM purchases t1
JOIN (
SELECT address_id, max(purchased_at) max_purchased_at
FROM purchases
WHERE product_id = 1
GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC
Uma solução mais orientada para o PostgreSQL baseada na resposta da @ hkf:
SELECT * FROM (
SELECT DISTINCT ON (address_id) *
FROM purchases
WHERE product_id = 1
ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC
Problema esclarecido, estendido e resolvido aqui: Selecionando linhas ordenadas por alguma coluna e distintas em outra