我在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}}相关联。
答案 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()
给出了完全相同的结果。
答案 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
:
[ 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;