La documentazione dice:
DISTINCT ON ( expression [, ...] ) mantiene solo la prima riga di ogni set di righe in cui le espressioni date restituiscono uguali. [...] Si noti che la "prima riga" di ogni set è imprevedibile a meno che non venga utilizzato ORDER BY per assicurarsi che la riga desiderata appaia per prima. [...] Le espressioni DISTINCT ON devono corrispondere alle espressioni ORDER BY più a sinistra.
Documentazione ufficiale
Quindi dovrai aggiungere il address_id
all'ordine entro.
In alternativa, se stai cercando la riga completa che contiene il prodotto acquistato più di recente per ogni address_id
e quel risultato ordinato per purchased_at
quindi stai cercando di risolvere un problema N per gruppo massimo che può essere risolto con i seguenti approcci:
La soluzione generale che dovrebbe funzionare nella maggior parte dei 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
Una soluzione più orientata a PostgreSQL basata sulla risposta 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
Problema chiarito, esteso e risolto qui:selezione di righe ordinate per una colonna e distinte in un'altra