ビジネスシーン:
ストア テーブル dim_mty_store の 3 つのフィールドは、store_code (ストア)、director_code (ディレクター)、manager_code (リージョン) で、レベルは小さいものから大きいものまで、ストア < ディレクター < リージョンです。
店舗、ディレクター、地域の 3 つの粒度に従って店舗数をカウントするには、最も愚かな方法は、3 回グループ化してからすべてを結合することです。コードは次のとおりです。
-- 1. 门店
select
manager_code,
director_code,
store_code,
count(store_code) as cnt
from dim_mty_store
group by
manager_code,
director_code,
store_code
union all
-- 2. 主任
select
manager_code,
director_code,
null as store_code,
count(store_code) as cnt
from dim_mty_store
group by
manager_code,
director_code
union all
-- 3. 大区
select
manager_code,
null as director_code,
null as store_code,
count(store_code) as cnt
from dim_mty_store
group by
manager_code
;
関連するショートカット メソッドは次のとおりです。
1.立方体
機能: すべてのフィールドの組み合わせの可能な組み合わせに従って、union all の結果をグループ化します。
実行順序: 最初に完全なセットを実行し、次にサブセットを (左から右に) 実行し、最後に空のセットを実行します。
grouping__id : グループ化フィールドの組み合わせに対応する ID。0 から始まり、完全なセットは 0、最大値は空のセットが空の場合です。
栗をあげます:
-- cube
set odps.sql.hive.compatible=true; --输出grouping__id时才需要该设置
select
store_code,
director_code,
manager_code,
grouping__id,
count(store_code) as cnt
from dim_mty_store
group by
manager_code,
director_code,
store_code
with cube
;
-- 底层执行的逻辑等同于下面这段逻辑,共8组,这里只写group by部分
-- 1、全集,grouping__id = 0
group by
manager_code,
director_code,
store_code
-- 2、所有子集,这里共有6组,两两组合3组,单个字段3组
union all
group by
manager_code,
director_code -- grouping__id = 1
union all
group by
manager_code,
store_code -- grouping__id = 2
union all
group by
manager_code -- grouping__id = 3
union all
group by
director_code,
store_code -- grouping__id = 4
union all
group by
director_code -- grouping__id = 5
union all
group by
store_code -- grouping__id = 6
-- 3、空集,用111代替
union all
group by 111 -- grouping__id = 7
2.ロールアップ:
機能: 立方体のサブセット。
実行順序: 最初に完全なセットを実行し、次に左端のフィールドを含むサブセットを左から右に実行し (フィールドの数は減少します)、最後に空のセットを実行します。
grouping__id : グループ化フィールドの組み合わせに対応する ID。0 から始まり、完全なセットは 0 で、最大値は空のセットで、これはキューブに対応する grouping__id のサブセットです。
使用方法は次のとおりです。
-- rollup
set odps.sql.hive.compatible=true; --输出grouping__id时才需要该设置
select
store_code,
director_code,
manager_code,
grouping__id,
count(store_code) as cnt
from dim_mty_store
group by
manager_code,
director_code,
store_code
with rollup
;
-- 底层执行的逻辑等同于下面这段逻辑,这里只写group by部分
-- 1、全集
group by
manager_code,
director_code,
store_code -- grouping__id = 0
--2、全部子集
union all
group by
manager_code,
director_code -- grouping__id = 1
union all
group by
manager_code -- grouping__id = 3
-- 3、空集
union all
group by 111 -- grouping__id = 7
3. セットのグループ化:
キューブおよびロールアップの実行結果に不要なデータがあると思われる場合は、グループ化セットを使用してグループ化フィールドを柔軟に設定できます。独自のビジネス ニーズに応じてグループ化するフィールドの組み合わせを指定します。結合されたフィールドに含まれないフィールドは、最終的に空に設定されます。使用方法は次のとおりです。
-- grouping sets
set odps.sql.hive.compatible=true; --输出grouping__id时才需要该设置
select
store_code,
director_code,
manager_code,
grouping__id,
count(store_code) as cnt
from dim_mty_store
group by
manager_code,
director_code,
store_code
grouping sets (
manager_code,
(manager_code, director_code),
(manager_code, director_code, store_code)
) ;
--结果等同于如下逻辑,这里只写group by
group by
manager_code, director_code, store_code --grouping__id = 0
union all
group by
manager_code, director_code --grouping__id = 1
union all
group by
manager_code --grouping__id = 3
この状況の最終結果は、理論的には最初の例の要件の結果と一致します。
もしあなたが初心者なら、私にアドバイスをください。あなたが専門家なら、馬鹿にしないでください。