Dokumentationen siger:
DISTINCT ON ( udtryk [, ...] ) beholder kun den første række af hvert sæt rækker, hvor de givne udtryk evalueres til at være lig. [...] Bemærk, at den "første række" i hvert sæt er uforudsigelig, medmindre ORDER BY bruges til at sikre, at den ønskede række vises først. [...] DISTINCT ON-udtrykket skal matche det eller de ORDER BY-udtryk længst til venstre.
Officiel dokumentation
Så du bliver nødt til at tilføje address_id
til ordren af.
Alternativt, hvis du leder efter den fulde række, der indeholder det senest købte produkt for hver address_id
og det resultat sorteret efter purchased_at
så forsøger du at løse det største N pr. gruppe-problem, som kan løses ved følgende tilgange:
Den generelle løsning, der burde virke i de fleste 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 mere PostgreSQL-orienteret løsning baseret 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 afklaret, udvidet og løst her:Valg af rækker ordnet efter en kolonne og adskilt i en anden