Документація говорить:
DISTINCT ON (вираз [, ...]) зберігає лише перший рядок кожного набору рядків, де дані вирази оцінюються рівними. [...] Зауважте, що "перший рядок" кожного набору є непередбачуваним, якщо ORDER BY не використовується для того, щоб бажаний рядок відображався першим. [...] Вираз DISTINCT ON повинен відповідати самому крайньому лівому виразу (ORDER BY).
Офіційна документація
Тому вам доведеться додати address_id
замовлення до.
Крім того, якщо ви шукаєте повний рядок, який містить найновіший придбаний продукт для кожного, address_id
і результат, відсортований за часом, purchased_at
ви намагаєтеся вирішити найбільшу проблему N на групу, яку можна вирішити наступними підходами:
Загальне рішення, яке має працювати в більшості СУБД:
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
Більше PostgreSQL-орієнтоване рішення, засноване на відповіді @ 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
Проблема, уточнена, розширена та вирішена тут: Вибір рядків, упорядкованих деяким стовпцем, та відмінності в іншому