複数のエントリがあるテーブルがあり、販売基準に従って注文しました。したがって、エントリが次のような場合:
アイテム販売 10 b 10 c 9 d 8 e 8 f 7
売上高が最も多いアイテムと2番目に多いアイテムを抽出したいと思います。a
そのため、、、を抽出したいと思いb
ますc
。
これを助けることができるPostgreSQLの関数はありますか?
複数のエントリがあるテーブルがあり、販売基準に従って注文しました。したがって、エントリが次のような場合:
アイテム販売 10 b 10 c 9 d 8 e 8 f 7
売上高が最も多いアイテムと2番目に多いアイテムを抽出したいと思います。a
そのため、、、を抽出したいと思いb
ますc
。
これを助けることができる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;
そのためにはPostgreSQL8.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;
結果:
アイテム販売 ---- ----- 10 b 9