Dokumentationen säger:
DISTINCT ON ( uttryck [, ...] ) behåller endast den första raden i varje rad rader där de givna uttrycken evalueras till lika. [...] Observera att den "första raden" i varje uppsättning är oförutsägbar om inte ORDER BY används för att säkerställa att den önskade raden visas först. [...] DISTINCT ON-uttrycken måste matcha ORDER BY-uttrycken längst till vänster.
Officiell dokumentation
Så du måste lägga till address_id
till beställningen av.
Alternativt, om du letar efter hela raden som innehåller den senast köpta produkten för varje address_id
och det resultatet sorterat efter purchased_at
då försöker du lösa ett största N per grupp-problem som kan lösas med följande tillvägagångssätt:
Den allmänna lösningen som borde fungera i de flesta DBMS:er:
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
En mer PostgreSQL-orienterad lösning baserad på @hkfs svar:
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
Problem förtydligat, utökat och löst här:Välja rader ordnade efter någon kolumn och distinkta i en annan