Документацията казва:
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
Проблемът е изяснен, разширен и решен тук:Избор на редове, подредени по една колона и различни от друга