我在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 是将最后一行的所有对等体包含在顶部 nORDER 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top