文件显示:
不同于(表达式[,…])的只保留给定表达式计算结果相等的每组行的第一行.[...] 请注意,每个集合的"第一行"是不可预测的,除非使用ORDER BY来确保所需的行首先出现.[...] DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配.
Official documentation
所以你必须在订单上加上address_id
.
或者,如果你正在寻找每address_id
个包含最新购买产品的整行,并且结果按purchased_at
排序,那么你正在try 解决一个最大的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
一个基于@hkf答案的更面向PostgreSQL的解决方案:
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
问题在此得到澄清、扩展和解决:Selecting rows ordered by some column and distinct on another