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 修飾子の良い利用ケースです。ここにあるサンプルは、どの Linux ディストリビューションがどのバージョンで 2 つのデータセンターにインストールされているかに関するデータを含むテーブルです。ディストリビューション、バージョン、場所ごとにデータを確認することは価値があるかもしれません。
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)
は、意味を持たない階層を提供します。2 つのディストリビューション間でバージョンを確認することは意味がありません(Arch と RHEL は同じリリースサイクルやバージョン命名基準を持っていないため)。次の GROUPING SETS の例は、distro
と version
を同じセットでグループ化しているため、より適切です。
上記の例のバージョンは、ディストリビューションに関連付けられていない場合は意味を持たないかもしれませんが、カーネルバージョンを追跡する場合は、カーネルバージョンがどちらのディストリビューションにも関連付けられるため、意味があるかもしれません。次の例のように GROUPING SETS を使用することが、より良い選択かもしれません。