2012-03-09 124 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