LIMIT with Ties:PostgreSQL 实现了吗?
在 SQL Server 中,语法 TOP n WITH TIES 检索前 n 行以及任何捆绑的行。然而,PostgreSQL 用户可能想知道是否有等效的语法。
PostgreSQL 的解决方案:WITH TIES (PostgreSQL 13)
从 PostgreSQL 13 开始,WITH TIES 子句是介绍了。此子句的行为与其 SQL Server 对应子句类似,获取前 n 行以及任何关联行。
PostgreSQL 12 及更早版本的替代方案
在 PostgreSQL 13 之前,有与 TOP n with TIES 没有直接等价物。一种解决方法是执行以下查询:
WITH cte AS ( SELECT *, rank() OVER (ORDER BY <something>) AS rnk FROM tbl ) SELECT * FROM cte WHERE rnk <= n;
这里,rank() 为每一行分配一个排名,并包括与最后排名 n 相关的行。
示例
考虑一个值为 {10, 9, 8, 8, 2} 的 Numbers 表。以下查询将使用 PostgreSQL 12 及更早版本的替代方法返回 {10, 9, 8, 8}:
WITH cte AS ( SELECT nums, rank() OVER (ORDER BY nums DESC) AS rnk FROM Numbers ) SELECT * FROM cte WHERE rnk <= 3;
注意: 此替代方案中使用的rank()函数与dense_rank()不同,因为后者会返回太多行而产生不正确的结果。
以上是PostgreSQL 是否支持'TOP n WITH TIES”功能?的详细内容。更多信息请关注PHP中文网其他相关文章!