Dokumentacja mówi:
DISTINCT ON ( wyrażenie [, ...] ) zachowuje tylko pierwszy wiersz każdego zestawu wierszy, w których podane wyrażenia są równe. [...] Zwróć uwagę, że "pierwszy rząd" każdego zestawu jest nieprzewidywalny, chyba że zostanie użyte polecenie ORDER BY, aby upewnić się, że żądany rząd pojawi się jako pierwszy. [...] Wyrażenia DISTINCT ON muszą odpowiadać wyrażeniom ORDER BY znajdującym się najbardziej po lewej stronie.
Oficjalna dokumentacja
Musisz więc dodać address_id
na zamówienie przez.
Alternatywnie, jeśli szukasz pełnego wiersza zawierającego najnowszy zakupiony produkt dla każdego address_id
i ten wynik posortowany według purchased_at
wtedy próbujesz rozwiązać największą liczbę problemów na grupę, które można rozwiązać za pomocą następujących metod:
Ogólne rozwiązanie, które powinno działać w większości 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
Rozwiązanie bardziej zorientowane na PostgreSQL oparte na odpowiedzi @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
Tutaj wyjaśniono, poszerzono i rozwiązano problem:Wybieranie wierszy uporządkowanych według jednej kolumny i odrębnych w innej