So verwenden Sie Rollup und Cube im Bienenstock

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!

Acho que você gosta

Origin blog.csdn.net/TangYuG/article/details/120670732
Recomendado
Clasificación