GROUPING
GROUPING
ROLLUP および CUBE は、GROUP BY の修飾子です。これらはどちらも小計を計算します。ROLLUP は列の順序付きリストを取り、例えば (day, month, year)
のように、集計の各レベルで小計を計算し、最終的に合計を計算します。CUBE は指定された列のすべての可能な組み合わせに対して小計を計算します。GROUPING は ROLLUP または CUBE によって返された行がスーパーアグリゲートであるか、修飾されていない GROUP BY によって返される行であるかを識別します。
GROUPING 関数は複数の列を引数として受け取り、ビットマスクを返します。
1
はROLLUP
またはCUBE
の修飾子によって返された行が小計であることを示します0
はROLLUP
またはCUBE
によって返された行が小計でない行を示します
GROUPING SETS
デフォルトでは、CUBE 修飾子は CUBE に渡されたすべての列の可能な組み合わせの小計を計算します。GROUPING SETS を使用すると、計算する特定の組み合わせを指定できます。
階層データを分析することは、ROLLUP、CUBE、および GROUPING SETS 修飾子を使用するのに良いユースケースです。ここで示すサンプルは、2つのデータセンターにインストールされている Linux ディストリビューションとそのバージョンに関するデータを含むテーブルです。ディストリビューション、バージョン、場所別にデータを見る価値があります。
サンプルデータのロード
シンプルなクエリ
各データセンターのディストリビューション別サーバー数を取得する:
GROUPING SETS を使用した複数の GROUP BY ステートメントの比較
CUBE、ROLLUP、または GROUPING SETS を使用せずにデータを分解する:
GROUPING SETS を使用して同じ情報を取得する:
CUBE と GROUPING SETS の比較
次のクエリの CUBE CUBE(datacenter,distro,version)
は、意味がない階層を提供します。バージョンを2つのディストリビューションで見るのは意味がなく、Arch と RHEL は同じリリースサイクルやバージョン名の基準を持っていません。次の GROUPING SETS の例の方が適切で、distro
と version
を同じセットにグループ化しています。
上記の例では、ディストリビューションに関連付けられないときのバージョンは意味がないかもしれませんが、カーネルバージョンを追跡している場合は、カーネルバージョンがどのディストリビューションにも関連付けられるため、意味を持つかもしれません。次の例のように GROUPING SETS を使用する方が良い選択かもしれません。