Dokumentasi mengatakan:
DISTINCT ON ( ekspresi [, ...] ) hanya menyimpan baris pertama dari setiap set baris di mana ekspresi yang diberikan dievaluasi sama. [...] Perhatikan bahwa "baris pertama" dari setiap set tidak dapat diprediksi kecuali ORDER BY digunakan untuk memastikan bahwa baris yang diinginkan muncul terlebih dahulu. [...] Ekspresi DISTINCT ON harus cocok dengan ekspresi ORDER BY paling kiri.
Dokumentasi resmi
Jadi Anda harus menambahkan address_id
sesuai pesanan.
Atau, jika Anda mencari baris lengkap yang berisi produk yang paling baru dibeli untuk setiap address_id
dan hasil tersebut diurutkan berdasarkan purchased_at
maka Anda mencoba memecahkan N terbesar per masalah grup yang dapat diselesaikan dengan pendekatan berikut:
Solusi umum yang harus bekerja di sebagian besar 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
Solusi yang lebih berorientasi PostgreSQL berdasarkan jawaban @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
Masalah diklarifikasi, diperluas, dan diselesaikan di sini:Memilih baris yang diurutkan oleh beberapa kolom dan berbeda di kolom lain