10

我在 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,因为它与另一个并列。

4

3 回答 3

15

Postgres 13终于添加了WITH TIES. 看:


在PostgreSQL 12 之前没有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 文档中的这句话(来自上面的链接):

例如,如果表达式设置为 5,但另外 2 行与第 5 行中 ORDER BY 列的值匹配,则结果集将包含 7 行。

的工作WITH TIES是将最后一行的所有对等点包含在子句定义的前n中。给出完全相同的结果。ORDER BYrank()

为了确保,我使用 SQL Server 进行了测试,这是一个现场演示

db<>在这里摆弄

Postgres 12 或更早版本中大表的更快替代方案:

于 2012-03-09T07:44:07.493 回答
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
于 2012-03-09T07:56:14.010 回答
2

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

选择

[ 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<>小提琴演示

于 2020-05-23T09:21:31.050 回答