2012-03-11 38 views
1

我有一個包含多個條目的表,並且我已根據銷售標準對其進行了排序。所以,如果條目是這樣的:獲取列中前2個值之一的所有行

 
Item Sales 
a  10 
b  10 
c  9 
d  8 
e  8 
f  7 

我想提取具有最高和第二高的銷售數量的項目。因此, 我想提取a,bc
PostgreSQL中有沒有可以幫助解決這個問題的函數?

回答

2

要包括所有行與前兩名的銷售值中的一個,你可以使用dense_rank()窗口功能:

WITH x AS (
    SELECT * 
     ,dense_rank() OVER (ORDER BY sales DESC) AS rnk 
    FROM tbl 
    ) 
SELECT item, sales 
FROM x 
WHERE rnk < 3; 

您需要PostgreSQL 8.4或更高版本。


對於舊版本,你可以:

SELECT * 
FROM tbl 
JOIN (
    SELECT sales 
    FROM tbl 
    GROUP BY 1 
    ORDER BY 1 DESC 
    LIMIT 2 
    ) t1 USING (sales) 
1

使用ORDER BY和LIMIT:

SELECT Item, Sales 
    FROM mytable 
ORDER BY Sales DESC 
    LIMIT 2; 

結果:

 
item sales 
---- ----- 
a  10 
b  9 

SQL Fiddle

+1

只是好奇...爲什麼(地球上)你* *右對齊每行的第一項(S)? – Bohemian 2012-03-11 03:37:08

+1

但是,這不會照顧重複嗎?例如,如果我有 a 10 b 10 c 9 d 8 那麼你會想要一個,B和C但不是這隻給你一個和B? – 2012-03-11 03:38:32

+0

感謝您的評論,@Bohemian。我不這樣做IRL。儘管如此,看起來更容易閱讀,但僅供舉例之用。顯然不是每個人,但:D – bernie 2012-03-11 03:39:22

相關問題