PostgreSQL DISTINCT ON
错误:不匹配 ORDER BY
子句
将 PostgreSQL 的 DISTINCT ON
与包含不同表达式的 ORDER BY
子句一起使用可能会导致错误:“SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配。” 发生这种情况是因为 DISTINCT ON
根据指定的列选择唯一行,而 ORDER BY
指示这些唯一行的呈现顺序。 因此,DISTINCT ON
中的列必须与 ORDER BY
子句中的前导列匹配。
例如,如果您需要检索不同的 address_id
值,同时对具有最新 purchased_at
时间戳的行进行优先级排序,那么在使用 address_id
时,仅按 ORDER BY
子句中的 DISTINCT ON (address_id)
进行排序是不够的。 这是因为 DISTINCT ON
会根据 子句为遇到的每个 选择 address_id
第一个 ORDER BY
行。
这里有两个有效的解决方法:
方法一:子查询求最大值purchased_at
此方法使用子查询来查找每个 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:使用 DISTINCT ON
和 ORDER BY
这个 PostgreSQL 特定的解决方案使用嵌套查询。内部查询使用 DISTINCT ON
选择所需的唯一行,并进行适当排序,外部查询对结果重新排序:
<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 的'SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!