Tài liệu cho biết:
DISTINCT ON (biểu thức [, ...]) chỉ giữ hàng đầu tiên của mỗi tập hợp các hàng trong đó các biểu thức đã cho đánh giá là bằng nhau. [...] Lưu ý rằng "hàng đầu tiên" của mỗi tập hợp là không thể đoán trước được trừ khi ORDER BY được sử dụng để đảm bảo rằng hàng mong muốn xuất hiện trước. [...] (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
đặt hàng trước.
Ngoài ra, nếu bạn đang tìm kiếm toàn bộ hàng có chứa sản phẩm được mua gần đây nhất cho mỗi 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 cách tiếp cận sau:
Giải pháp chung sẽ 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 hơn 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 tại đâ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