Dokumentace říká:
DISTINCT ON ( výraz [, ...] ) zachová pouze první řádek každé sady řádků, kde jsou dané výrazy vyhodnoceny jako stejné. [...] Všimněte si, že "první řádek" každé sady je nepředvídatelný, pokud není použito ORDER BY k zajištění toho, že se požadovaný řádek objeví jako první. [...] Výraz(y) DISTINCT ON se musí shodovat s výrazem(y) ORDER BY zcela vlevo.
Oficiální dokumentace
Takže budete muset přidat address_id
k objednávce do.
Případně, pokud hledáte celý řádek, který obsahuje poslední zakoupený produkt pro každý address_id
a výsledek seřazený podle purchased_at
pak se snažíte vyřešit největší problém N na skupinu, který lze vyřešit následujícími přístupy:
Obecné řešení, které by mělo fungovat ve většině 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
Řešení více orientované na PostgreSQL založené na odpovědi @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
Zde je problém objasněn, rozšířen a vyřešen:Výběr řádků seřazených podle některého sloupce a odlišných v jiném