PostgreSQL等价于具有TIES的TOP n:限制"与领带"?
-
09-12-2019 - |
题
我在SQL Server中寻找类似的东西:
SELECT TOP n WITH TIES FROM tablename
我知道 LIMIT
在PostgreSQL中,但上述等价物是否存在?我只是好奇,因为它每次都会为我节省一个额外的查询。
如果我有一张桌子 Numbers
带属性 nums
: {10, 9, 8, 8, 2}
.我想做类似的事情:
SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3
它应该回来 {10, 9, 8, 8}
因为它需要前3名加上额外的 8
因为它把另一个绑在一起。
解决方案
没有 WITH TIES
条款在 PostgreSQL的 就像有在 SQL服务器.
在PostgreSQL中,我会将其替换为 TOP n WITH TIES .. ORDER BY <something>
:
WITH cte AS (
SELECT *, rank() OVER (ORDER BY <something>) AS rnk
FROM tbl
)
SELECT *
FROM cte
WHERE rnk <= n;
要明确, rank()
是对的, dense_rank()
会是错误的(返回太多行)。
考虑一下SQL Server文档中的引用(来自上面的链接):
例如,如果表达式设置为5,但有2个额外的行匹配 按列顺序排列的值在第5行中,结果集将包含7 行。
的工作 WITH TIES
是将最后一行的所有对等体包含在顶部 n 由 ORDER BY
条款。 rank()
给出完全相同的结果。
为了确保,我用SQL server进行了测试,这里是一个 现场演示.
这里有一个更方便的 SQLfiddle碌录潞陆.
其他提示
试试这个:
输出:10, 9, 8, 8
with numbers (nums) as (
values (10), (9), (8), (8), (2)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
输出:10,10,9,8,8
with numbers (nums) as (
values (10), (9), (8), (8), (2), (10)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
不隶属于 StackOverflow