2012-03-09 122 views
9

我正在寻找在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,因为它关系另一个。

回答

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()给出完全相同的结果。

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

+1

为什么这样复杂? rank()函数将完成所需的功能? – 2012-03-09 08:01:33

+0

@a_horse_with_no_name:你绝对是对的(起初我是这样)我的第二个考虑是不需要的。 – 2012-03-09 08:06:53

+0

@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

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