A documentação diz:
DISTINCT ON ( expressão [, ...] ) mantém apenas a primeira linha de cada conjunto de linhas em que as expressões fornecidas 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. [...] A(s) expressão(ões) DISTINCT ON devem corresponder à(s) expressão(ões) ORDER BY mais à esquerda.
Documentação oficial
Então você terá que adicionar o
address_id
à ordem de. Como alternativa, se você estiver procurando a linha completa que contém o produto comprado mais recente para cada
address_id
e esse resultado classificado por purchased_at
então você 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 ao PostgreSQL baseada na resposta do @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