La documentación dice:
DISTINCT ON (expresión [, ...]) mantiene solo la primera fila de cada conjunto de filas donde las expresiones dadas se evalúan como iguales. [...] Tenga en cuenta que la "primera fila" de cada conjunto es impredecible a menos que ORDER BY se utilice para garantizar que la fila deseada aparezca primero. [...] Las expresiones DISTINCT ON deben coincidir con las expresiones ORDER BY de la izquierda.
Documentación oficial
Entonces tendrás que agregar el address_id
al orden por.
Alternativamente, si está buscando la fila completa que contiene el producto comprado más reciente para cada uno address_id
y ese resultado ordenado porpurchased_at
entonces, está tratando de resolver el mayor problema de N por grupo que se puede resolver mediante los siguientes enfoques:
La solución general que debería funcionar en la mayoría de los DBMS:
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
Una solución más orientada a PostgreSQL basada en la respuesta de @ 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 aclarado, extendido y resuelto aquí: selección de filas ordenadas por una columna y distintas en otra