Documentatie zegt:
DISTINCT ON ( expression [, ...] ) houdt alleen de eerste rij van elke reeks rijen waar de gegeven expressies gelijk zijn aan. [...] Merk op dat de "eerste rij" van elke set onvoorspelbaar is, tenzij ORDER BY wordt gebruikt om ervoor te zorgen dat de gewenste rij als eerste verschijnt. [...] De DISTINCT ON-uitdrukking(en) moeten overeenkomen met de meest linkse ORDER BY-uitdrukking(en).
Officiële documentatie
U moet dus de address_id
. toevoegen naar de bestelling door.
Als alternatief, als u op zoek bent naar de volledige rij met het meest recent gekochte product voor elke address_id
en dat resultaat gesorteerd op purchased_at
dan probeer je een probleem met de grootste N per groep op te lossen dat kan worden opgelost door de volgende benaderingen:
De algemene oplossing die in de meeste DBMS'en zou moeten werken:
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
Een meer PostgreSQL-georiënteerde oplossing op basis van het antwoord van @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
Probleem verduidelijkt, uitgebreid en opgelost hier:rijen selecteren geordend op een kolom en onderscheiden op een andere