PostgreSQL等同于TOP n WITH TIES:LIMIT“with ties”?
问题描述:
我正在寻找在SQL Server中类似这样的:PostgreSQL等同于TOP n WITH TIES:LIMIT“with ties”?
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
,因为它关系另一个。
答
在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文档此引号(从上方连结):
例如,如果表达被设置为5点,但2个附加的行5行匹配订单的 值BY列,则结果集将包含7个 行。
的WITH TIES
工作是包括最后一行的所有同行在顶部ñ由ORDER BY
条款定义。 rank()
给出完全相同的结果。
答
试试这个:
输出: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
为什么这样复杂? rank()函数将完成所需的功能? – 2012-03-09 08:01:33
@a_horse_with_no_name:你绝对是对的(起初我是这样)我的第二个考虑是不需要的。 – 2012-03-09 08:06:53
@Erwin:这很好(http://data.stackexchange.com/stackoverflow/query/63525/top-n-with-ties),我不知道stackoverflow有一个内置的模块来运行查询:-)虽然10,9,8,8,2,10,10,10,9的输出是不正确的,如果你需要得到前3(10,9,8)并列出所有10,9,8;应该是:10,10,9,8,8。对于某些给定的问题,'WITH TIES'可能不正确:http://stackoverflow.com/questions/2611822/distinct-with-count-and-sql-server-2005/2612456#2612456 – 2012-03-09 08:49:23