首页 > 数据库 > mysql教程 > 如何解决 PostgreSQL 的 DISTINCT ON Mismatched ORDER BY Clause 错误?

如何解决 PostgreSQL 的 DISTINCT ON Mismatched ORDER BY Clause 错误?

Susan Sarandon
发布: 2025-01-21 12:08:11
原创
173 人浏览过

How to Resolve PostgreSQL's DISTINCT ON Mismatched ORDER BY Clause Error?

排除 PostgreSQL 的 DISTINCT ON 子句不匹配错误

PostgreSQL 的 DISTINCT ON 子句要求 ORDER BY 表达式精确匹配不同的列。 尝试使用不同的表达式进行查询将导致错误。 简单地将 address_id 添加为 ORDER BY 子句中的第一个元素,虽然是错误的解决方案,但可能不会返回预期结果。

以下是在不更改 ORDER BY 子句中的 DISTINCT ON 的情况下检索正确数据的替代方法:

方法 1:每组最大 N 方法(与 DBMS 无关)

此方法使用子查询来查找每个 purchased_at 的最大值 address_id,然后连接回原始表以检索完整的行:

<code class="language-sql">SELECT t1.* 
FROM purchases t1
JOIN (
    SELECT address_id, max(purchased_at) as 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;</code>
登录后复制

方法 2:PostgreSQL 特定解决方案

此方法利用嵌套查询,在内部查询中使用 DISTINCT ON 为每个 address_id 选择所需的行,然后在外部查询中根据需要对最终结果进行排序:

<code class="language-sql">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;</code>
登录后复制

这些方法提供了灵活的解决方案,用于检索必要的数据,同时保持所需的排序顺序,避免需要妥协 DISTINCT ON 子句的 ORDER BY 表达式。

以上是如何解决 PostgreSQL 的 DISTINCT ON Mismatched ORDER BY Clause 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板