文档说:
DISTINCT ON ( 表达式 [, ...] ) 仅保留给定表达式计算结果为相等的每组行的第一行。[...] 请注意,除非使用 ORDER BY 来确保所需的行首先出现,否则每组的“第一行”是不可预测的。[...] DISTINCT ON 表达式必须匹配最左边的 ORDER 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
基于@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
问题在这里得到了澄清、扩展和解决:选择按某列排序的行和另一列不同的行