PostgreSQL では、ROW_NUMBER()、RANK()、および DENSE_RANK() は、結果セットのパーティション内の行に一意の番号を割り当てるために使用されるウィンドウ関数です。これらは、結果セットのパーティションと順序を定義するために、OVER() 句と組み合わせて使用​​されることがよくあります。

ROW_NUMBER():この関数は選択されたすべての行を昇順でランク付けします。この関数は各行に一意の行番号が付与されます。partition by と一緒に使用すると、各グループ内で一意の行番号が付与されます。

RANK():この関数順位を割り当てるが、同点の場合は順位を飛ばす。パーティションと併用すると、各グループ内の順位が示されます。

DENSE_RANK():この関数同点の場合は数字を飛ばさずに順位を割り当てます。 パーティションと一緒に使用すると、各グループ内のランクをスキップせずに、密なランクが得られます。

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 1

描写に使用したテーブルBASKETを以下に示します。

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 0


ROW_NUMBER() 関数の例:

これは最も単純なものです。この関数は選択された行を昇順でランク付けするだけです。

Select *, ROW_NUMBER() OVER(ORDER BY price) from basket;

価格に基づいて行番号が昇順に割り当てられ、結果のテーブルは次のようになります。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 2

Rank() 関数の例:

PostgreSQL の RANK は各グループのランクを割り当てます。値が同じままの場合、両方の番号は同じランクになり、次のランクはスキップされます。

select *, Rank() OVER(ORDER BY price) from basket;

ランク付けされた結果の表は次のようになります。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 3

PostgreSQL の DENSE_RANK:

PostgreSQL の DENSE_RANK は、各グループのランクを割り当てます。ランクはギャップなしに割り当てられるため、ランク付けがスキップされることはありません。

select *, DENSE_Rank() OVER(ORDER BY price) from basket;

結果のdense_rankテーブルは次のようになります。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 4

PostgreSQL の ROW_NUMBER と PARTITION BY の組み合わせ

ROW_NUMBER() は、パーティション (グループ) 内の行に一意の連続整数を割り当てます。

select *, ROW_NUMBER () OVER (
PARTITION BY item_group
ORDER BY
price
) from Basket;

したがって、row_numberを持つ結果のテーブルは、「Dairy」、「Fruits」、「Vegetable」などの各グループに割り当てられます。これらのグループはすべて独自のrow_number()を取得します。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 5

PostgreSQL の RANK() と PARTITION BY の組み合わせ

PostgreSQL の RANK は各グループのランクを割り当てます。値が同じままの場合、両方の番号は同じランクになり、次のランクはスキップされます。

select *, RANK() OVER (
PARTITION BY item_group
ORDER BY
price
) from Basket;

したがって、ランクを含む結果のテーブルは、「Dairy」、「Fruits」、「Vegetable」などの各グループに割り当てられます。これらのグループはすべて、グループ内で独自のランクを取得します。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 6

DENSE_RANKに沿ってPostgreSQLのPARTITION BYを使用する

PostgreSQL の DENSE_RANK は、各グループのランクを割り当てます。ランクはギャップなしに割り当てられるため、ランク付けがスキップされることはありません。

select *, DENSE_RANK () OVER (
PARTITION BY item_group
ORDER BY
price
) from Basket;

したがって、dense_rank を含む結果のテーブルは、「Dairy」、「Fruits」、「Vegetable」などの各グループに割り当てられます。これらのグループはすべて、グループ内での密度ランクを取得します。

出力:

PostgreSQL の ROW_NUMBER()、RANK()、DENSE_RANK() 7