PostgreSQL相当于TOP n WITH TIES:LIMIT"有关系"?

时间:2012-03-09 06:38:49

标签: sql sql-server postgresql window-functions sql-limit

我在SQL Server中寻找类似的东西:

SELECT TOP n WITH TIES FROM tablename

我知道PostgreSQL中的LIMIT,但是上面存在的相同吗?我很好奇,因为它每次都会为我节省额外的查询。

如果我的表格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,因为它与另一名{{1}}相关联。

3 个答案:

答案 0 :(得分:8)

PostgreSQL中没有WITH TIES条款,就像SQL Server中一样 在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文档中的引用(来自上面的链接):

  

例如,如果expression设置为5但是另外两行匹配   第5行中ORDER BY列的值,结果集将包含7   行。

WITH TIES的工作是包括ORDER BY子句定义的顶部 n 中最后一行的所有对等项。 rank()给出了完全相同的结果。

为了确保,我使用SQL服务器进行了测试,这里是live demo 这是一个更方便的SQLfiddle

答案 1 :(得分:2)

试试这个:

输出: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

答案 2 :(得分:2)

PostgreSQL已经支持 OFFEST FETCH 子句,从版本13开始,它将支持 FETCH FIRST WITH TIES

SELECT

[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]

WITH TIES选项用于根据ORDER BY子句返回与结果集中最后一行相关的所有其他行;在这种情况下,必须使用ORDER BY。

查询:

SELECT nums 
FROM Numbers 
ORDER BY nums DESC
FETCH NEXT 3 ROWS WITH TIES;

db<>fiddle demo