Postgresランク

Postgresranku



PostgreSQL では、rank() 関数は、指定された並べ替え基準に基づいて結果セット内の各行にランクを割り当てることができるウィンドウ関数です。ほとんどのウィンドウ関数と同様に、ランク関数は、特定の結果セット内の他の行と相対的な行のランクを決定するなどの分析クエリに役立ちます。

このチュートリアルでは、PostgreSQL 関数の操作方法について説明します。また、関数の構文とパラメーターについて調べ、いくつかの実用的な例を見ていきます。

PostgreSQL Rank() 関数

以下に、PostgreSQL の Rank() 関数の構文を示します。







RANK() OVER (PARTITION BY パーティション式 ORDER BY ソート式 [ASC|DESC])

まず、rank() 関数を呼び出します。次に、OVER キーワードを使用して、ウィンドウ関数操作を実行することを示します。



次は PARTITION BY パーティション式です。この句は、指定された式に基づいて行をさまざまなパーティションに分割します。ランク付けは各パーティションで独立して行われ、ランク整数値は新しいパーティションごとに 1 から始まります。



最後に、行の順序を決定する列または式を指定する ORDER BY 句があります。





PostgreSQL Rank() 関数の例

次のクエリは、PostgreSQL の Rank() 関数を使用する基本的な例を示しています。

SELECT 値、RANK() OVER (ORDER BY 値) AS ランク
から (
値 (10)、(20)、(5)、(15)、(10)
) AS データ(値);

この例では、値を昇順に基づいてランク付けします。値の 2 つの出現には類似しており、順序内の同じ位置に表示されるため、同じランクが割り当てられます。



結果のテーブルは次のとおりです。

SELECT 値、RANK() OVER (PARTITION BY 値 % 2 ORDER BY 値) AS ランク
から (
値 (10)、(20)、(5)、(15)、(10)
) AS データ(値);

Partition By 句を使用した PostgreSQL Rank() 関数の例

次の例を考えてみましょう。

SELECT 値、RANK() OVER (PARTITION BY 値 % 2 ORDER BY 値) AS ランク
から (
値 (10)、(20)、(5)、(15)、(10)
) AS データ(値);

この例では、値が偶数か奇数かをチェックする式を含む PARTITION BY 句を追加しました。これにより、値が 2 つのパーティションに効果的にグループ化されます。1 つは偶数用 (剰余は 0)、もう 1 つは奇数用 (剰余は 1) です。

結果のセットは次のようになります。

複数の SQL 機能を組み合わせた PostgreSQL Rank() 関数の例

Rank() 関数を使用して、より複雑なクエリを作成することもできます。たとえば、Pagila データベースを考えてみましょう。レンタル料の合計に基づいて上位 5 人の顧客を取得し、ランクを割り当てたいとします。

次のクエリに示すように、rank() 関数を使用できます。

SELECT customer_id、first_name、last_name、total_payments、
RANK() OVER (ORDER BY total_payments DESC) AS ランク
から (
SELECT c.customer_id、c.first_name、c.last_name、SUM(p.amount) AS total_payments
お客様c様より
JOIN 支払い p ON c.customer_id = p.customer_id
c.customer_id、c.first_name、c.last_name によるグループ化
) AS customer_payments
ランク順に並べる
リミット10;

この例では、customer_id、first_name、last_name、total_payment、および割り当てられたrank()を選択します。次に、rank() 関数を使用して、降順に並べ替えられた total_payment に基づいて各顧客にランクを割り当てます。

内部サブクエリでは、顧客テーブルと支払いテーブルを結合することで、各顧客の支払い総額を計算できます。次に、customer_id、first_name、last_name 列に基づいて結果をグループ化し、各顧客の支払い合計を取得します。

最後に、外側のクエリで、rank() 関数を結果セットに適用し、total_payments で昇順に並べ替えます。また、上位 10 行のみをフェッチする制限句も含めます。

ご覧のとおり、並べ替え、フィルタリング、集計、結合などの複数の SQL 機能を組み合わせることで、より洞察力に富んだデータを生成できます。

結論

PostgreSQL の Rank() 関数を使用して、定義された条件に基づいて結果セットから特定の行のランクを取得する方法を検討しました。また、rank() 関数と他の SQL ツールを組み合わせて、より複雑なクエリを作成する方法についても説明しました。