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