เอกสารอธิบายว่า:
DISTINCT ON (expression [, ... ]) เก็บเฉพาะแถวแรกของแถวแต่ละชุดที่นิพจน์ที่กำหนดให้ประเมินเท่ากัน [... ] โปรดทราบว่า "แถวแรก" ของแต่ละชุดจะไม่สามารถคาดเดาได้เว้นแต่จะใช้ ORDER BY เพื่อให้แน่ใจว่าแถวที่ต้องการปรากฏขึ้นเป็นครั้งแรก [... ] นิพจน์ DISTINCT ON ต้องตรงกับคำสั่ง OREST BY ทางซ้ายสุด
เอกสารอย่างเป็นทางการ
ดังนั้นคุณจะต้องเพิ่มaddress_id
คำสั่งซื้อโดย
หรือหากคุณกำลังมองหาแถวที่มีผลิตภัณฑ์ที่ซื้อล่าสุดสำหรับแต่ละรายการaddress_id
และผลลัพธ์นั้นเรียงลำดับตามpurchased_at
นั้นคุณกำลังพยายามแก้ไขปัญหา N ต่อกลุ่มที่ยิ่งใหญ่ที่สุดซึ่งสามารถแก้ไขได้ด้วยวิธีการต่อไปนี้:
โซลูชันทั่วไปที่ควรทำงานใน 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
โซลูชัน PostgreSQL ที่มุ่งเน้นเพิ่มเติมตามคำตอบของ @ 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
ปัญหาที่ได้รับการชี้แจงขยายและแก้ไขที่นี่: การเลือกแถวที่เรียงตามคอลัมน์และแตกต่างกัน