我想运行这个查询:
SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*
FROM purchases
WHERE purchases.product_id = 1
ORDER BY purchases.purchased_at DESC
但我收到这个错误:
PG::Error: ERROR: SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配
Adding address_id
作为第一个ORDER BY
表达式消除了错误,但我真的不想添加排序address_id
。是否可以不订购address_id
?
文档说:
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's 答案的更面向 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
问题在这里得到澄清、扩展和解决:选择按某列排序且在另一列上不同的行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)