Tài liệu nói:
DISTINCT ON (biểu thức [, ...]) chỉ giữ hàng đầu tiên của mỗi bộ hàng trong đó các biểu thức đã cho ước tính bằng nhau. [...] Lưu ý rằng "hàng đầu tiên" của mỗi bộ là không thể đoán trước trừ khi ORDER BY được sử dụng để đảm bảo rằng hàng mong muốn xuất hiện đầu tiên. [...] (Các) biểu thức DISTINCT ON phải khớp với (các) biểu thức ORDER BY ngoài cùng bên trái.
Tài liệu chính thức
Vì vậy, bạn sẽ phải thêm address_id
đơn đặt hàng bằng cách.
Ngoài ra, nếu bạn đang tìm kiếm toàn bộ hàng chứa sản phẩm được mua gần đây nhất cho từng sản phẩm address_id
và kết quả được sắp xếp theo purchased_at
thì bạn đang cố gắng giải quyết vấn đề N lớn nhất cho mỗi nhóm có thể được giải quyết bằng các phương pháp sau:
Giải pháp chung nên hoạt động trong hầu hết các 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
Một giải pháp định hướng PostgreSQL khác dựa trên câu trả lời của @ 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
Vấn đề được làm rõ, mở rộng và giải quyết ở đây: Chọn các hàng được sắp xếp theo một số cột và phân biệt trên một cột khác