グループ化
GROUPING
ROLLUP と CUBE は GROUP BY の修飾子です。これらはいずれも小計を計算します。ROLLUP は (day, month, year) のような順序付きのカラムリストを受け取り、集約の各レベルで小計を計算し、最後に総計を計算します。CUBE は、指定されたカラムのあらゆる組み合わせに対して小計を計算します。GROUPING は、ROLLUP または CUBE によって返される行のうち、どれがスーパー集約(より上位レベルの集約行)であり、どれが修飾されていない GROUP BY によって返される行に相当するかを識別します。
GROUPING 関数は複数のカラムを引数として取り、ビットマスクを返します。
1は、GROUP BYに対するROLLUPまたはCUBE修飾子によって返された行が小計であることを示します0は、GROUP BYに対するROLLUPまたはCUBE修飾子によって返された行が小計ではないことを示します
GROUPING SETS
デフォルトでは、CUBE 修飾子は、CUBE に渡された列のあらゆる組み合わせに対して小計を計算します。GROUPING SETS を使用すると、計算する組み合わせを明示的に指定できます。
階層データの分析は、ROLLUP、CUBE、GROUPING SETS 修飾子の代表的なユースケースの 1 つです。ここでのサンプルは、2 つのデータセンターにインストールされている Linux ディストリビューションとそのバージョンに関するデータを含むテーブルです。ディストリビューション別、バージョン別、ロケーション別にデータを確認することが有用な場合があります。
サンプルデータの読み込み
簡単なクエリ
分布別に各データセンター内のサーバー数を取得します。
複数の GROUP BY と GROUPING SETS の比較
CUBE、ROLLUP、GROUPING SETS を使わずにデータを集計する場合:
GROUPING SETS を使って同じ情報を取得する場合:
GROUPING SETS との比較
次のクエリにおける CUBE CUBE(datacenter,distro,version) は、意味のある階層にはなりません。Arch と RHEL ではリリースサイクルやバージョン命名規則が異なるため、2 つのディストリビューションをまたいでバージョンを見ることには意味がありません。この後に続く GROUPING SETS の例のほうが適切であり、distro と version を同じセット内でグループ化しています。
上記の例におけるバージョンは、ディストリビューションと結び付いていない場合には、あまり意味をなさないかもしれません。カーネルバージョンを追跡しているのであれば、カーネルバージョンはどちらのディストリビューションにも結び付けられるため、意味を持つと言えるでしょう。次の例で示すように GROUPING SETS を使用する方が、より適切な選択肢となる場合があります。