Geschäftsszene:
Eine Filialtabelle dim_mty_store, die drei Felder sind Store_code (Store), Director_code (Director), Manager_code (Region), die Ebenen sind von klein nach groß: Store < Director < Region.
Um die Anzahl der Filialen entsprechend den drei Granularitäten Filiale, Direktor und Region zu zählen, ist es am dümmsten, sie dreimal zu gruppieren und dann alle zu vereinen. Der Code lautet wie folgt:
-- 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
;
Die relevanten Verknüpfungsmethoden sind wie folgt:
1. Würfel
Funktion : Gruppieren Sie die Ergebnisse der Vereinigung aller nach den möglichen Kombinationen aller Feldkombinationen.
Ausführungsreihenfolge : Führen Sie zuerst den vollständigen Satz aus, dann die Teilmenge (von links nach rechts) und schließlich den leeren Satz.
grouping__id : Die ID, die der Gruppierungsfeldkombination entspricht, beginnend bei 0, der vollständige Satz ist 0 und das Maximum ist, wenn der leere Satz leer ist.
Schenken Sie eine Kastanie:
-- 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. Rollup:
Funktion : Eine Teilmenge des Würfels.
Ausführungsreihenfolge : Führen Sie zuerst den vollständigen Satz aus, führen Sie dann die Teilmenge einschließlich des Felds ganz links von links nach rechts aus (die Anzahl der Felder nimmt ab) und führen Sie schließlich den leeren Satz aus.
grouping__id : Die ID, die der Gruppierungsfeldkombination entspricht, beginnend bei 0, der vollständige Satz ist 0 und das Maximum ist der leere Satz, der eine Teilmenge der dem Würfel entsprechenden Gruppierungs_ID ist.
Die Nutzung ist wie folgt:
-- 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. Gruppierungssätze:
Wenn Sie der Meinung sind, dass die Cube- und Rollup-Ausführungsergebnisse einige Daten enthalten, die nicht benötigt werden, können Sie die Gruppierungsfelder mithilfe von Gruppierungssätzen flexibel festlegen. Geben Sie die Feldkombination an, die entsprechend Ihren eigenen Geschäftsanforderungen gruppiert werden soll. Felder, die nicht im kombinierten Feld enthalten sind, werden schließlich auf leer gesetzt. Die Verwendung ist wie folgt:
-- 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
Das Endergebnis dieser Situation stimmt theoretisch mit dem Ergebnis der anfänglichen Beispielanforderungen überein.
Wenn Sie ein Neuling sind, geben Sie mir bitte einen Rat, und seien Sie kein Idiot, wenn Sie ein Experte sind!