1
我有一個包含多個條目的表,並且我已根據銷售標準對其進行了排序。所以,如果條目是這樣的:獲取列中前2個值之一的所有行
Item Sales a 10 b 10 c 9 d 8 e 8 f 7
我想提取具有最高和第二高的銷售數量的項目。因此, 我想提取a
,b
和c
。
PostgreSQL中有沒有可以幫助解決這個問題的函數?
我有一個包含多個條目的表,並且我已根據銷售標準對其進行了排序。所以,如果條目是這樣的:獲取列中前2個值之一的所有行
Item Sales a 10 b 10 c 9 d 8 e 8 f 7
我想提取具有最高和第二高的銷售數量的項目。因此, 我想提取a
,b
和c
。
PostgreSQL中有沒有可以幫助解決這個問題的函數?
要包括所有行與前兩名的銷售值中的一個,你可以使用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)
使用ORDER BY和LIMIT:
SELECT Item, Sales
FROM mytable
ORDER BY Sales DESC
LIMIT 2;
結果:
item sales ---- ----- a 10 b 9
只是好奇...爲什麼(地球上)你* *右對齊每行的第一項(S)? – Bohemian 2012-03-11 03:37:08
但是,這不會照顧重複嗎?例如,如果我有 a 10 b 10 c 9 d 8 那麼你會想要一個,B和C但不是這隻給你一個和B? – 2012-03-11 03:38:32
感謝您的評論,@Bohemian。我不這樣做IRL。儘管如此,看起來更容易閱讀,但僅供舉例之用。顯然不是每個人,但:D – bernie 2012-03-11 03:39:22