Belgeler diyor:
DISTINCT ON (ifade [, ...]), verilen ifadelerin eşit olduğu değerlendirilen her satır kümesinin yalnızca ilk satırını tutar. [...] İstenen satırın önce görünmesini sağlamak için ORDER BY kullanılmadığı sürece her kümenin "ilk satırı" nın önceden kestirilemeyeceğini unutmayın. [...] DISTINCT ON ifadeleri, en sol ORDER BY ifadesiyle eşleşmelidir.
Resmi belgeler
Yani address_id
siparişi ile eklemeniz gerekecek .
Alternatif olarak, her biri için en son satın alınan ürünü içeren tam satırı arıyorsanız address_id
ve bu sonuca göre sıralanmışsa purchased_at
, aşağıdaki yaklaşımlarla çözülebilecek en büyük N grubu problemini çözmeye çalışıyorsunuz:
Çoğu DBMS'de çalışması gereken genel çözüm:
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
@ Hkf'nin cevabına dayanan daha PostgreSQL odaklı bir çözüm:
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
Burada açıklığa kavuşturulmuş, genişletilmiş ve çözülmüş sorun: Bir sütun tarafından sıralanan ve diğerinde farklı olan satırları seçme