指定した列の値でグループ化して集計する - PARTITION BY の利用 - SQL

指定した列の値でグループ化して集計するSQLを紹介します。

概要

集計関数で値を求める際に、指定した列の値でグループ化して、各グループごとに集計関数を実行したい場合があります。
SQLの PARTITION BY (OVER PARTITION BY)を利用すると、指定した列ごとにグループ化して集計関数を実行できます。

書式

以下の書式を利用します。
[集計関数] OVER (PARTITION BY [列名]) 

記述例

select *, rank() over (partition by point) as ranking from ItemTable

例1:rank() による順位付与

以下のテーブルを準備します。
Products テーブル
idnamepricecategory
1Penguin500Bird
2Bear1050Mammal
3Duck150Bird
4Camel920Mammal
5Owl185Bird
6Whale880Mammal

次のSQLを実行します。
SELECT *, RANK() OVER (PARTITION BY category ORDER BY price) AS ranking FROM Products

解説

RANK() OVER (PARTITION BY category ORDER BY price) AS ranking 部分が PARTITION BY によるSQL文です。 category の値ごとにグループ化し、それぞれのグループでORDER BY priceを実行し、priceの値でソートして、RANK関数で順位の値を設定します。
RANK関数の値は AS ranking より、ranking 列とします。

実行結果

SQL文を実行すると以下の結果が返ります。
category列の値ごとにpriceの値で順位の値がranking列に設定された結果が得られます。
idnamepricecategoryranking
3Duck150Bird1
5Owl185Bird2
1Penguin500Bird3
6Whale880Mammal1
4Camel920Mammal2
2Bear1050Mammal3

例2:max() による最高値

先のProductsテーブルを用意し以下のSQL文を実行します。
SELECT *, MAX(price) OVER (PARTITION BY category) AS maxprice FROM Products

解説

MAX(price) OVER (PARTITION BY category) AS maxprice 部分が PARTITION BY によるSQL文です。 categoryごとにグループ化し、そのグループ内でのpriceの最大値を列に設定します。 列名は、AS maxprice により、maxprice列となります。

実行結果

SQL文を実行すると以下の結果が返ります。
category列ごとに最大値がmaxpriceに設定されます。 category が Bird のレコードは、"id=1" の "Penguin" のprice の値が一番大きい500ですので、maxpriceには500が設定されます。 一方、categoryが Mammal のレコードは、"id=2" の "Bear" のprice の値が一番大きい1050ですので、maxpriceには1050が設定されます。
idnamepricecategorymaxprice
1Penguin500Bird500
3Duck150Bird500
5Owl185Bird500
6Whale880Mammal1050
4Camel920Mammal1050
2Bear1050Mammal1050

例3:sum() による合計

先のProductsテーブルを用意し以下のSQL文を実行します。
SELECT *, SUM(price) OVER (PARTITION BY category) AS total FROM Products

解説

SUM(price) OVER (PARTITION BY category) 部分が PARTITION BY によるSQL文です。 categoryごとにグループ化し、そのグループ内でのpriceの合計値を列に設定します。 列名は、AS total により、total列の名称になります。

実行結果

SQL文を実行すると以下の結果が返ります。
categoryの値ごとに、priceの合計値がtotal列に設定されます。 categoryがBirdのレコードは、Penguinの500、Duckの150、Owlの185を足した835が設定されます。 categoryがMammalのレコードは、Whaleの880、Camelの920、Bearの1050を足した2850が設定されます。
idnamepricecategorytotal
1Penguin500Bird835
3Duck150Bird835
5Owl185Bird835
6Whale880Mammal2850
4Camel920Mammal2850
2Bear1050Mammal2850

例4

PARTITION BY 句を利用して、GROUP BYクエリーが返す列の値に最大または最新のレコードの値を返す処理を実現できます。
詳細はこちらの記事を参照してください。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-12-09
作成日: 2023-03-28
iPentec all rights reserverd.