甲骨文 - GROUPING_ID 与分组集

Oracle - GROUPING_ID with GROUPING SETS

我想根据一个例子来验证我的理解,因为这将用于为我的项目构建一个等效的查询。这是引用自 https://oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets#grouping_sets

的例子
SELECT fact_1_id,
       fact_2_id,
       fact_3_id,
       SUM(sales_value) AS sales_value,
       GROUPING_ID(fact_1_id, fact_2_id, fact_3_id) AS grouping_id
FROM   dimension_tab
GROUP BY GROUPING SETS((fact_1_id, fact_2_id), (fact_1_id, fact_3_id))
ORDER BY fact_1_id, fact_2_id, fact_3_id;

根据上面的查询,

  1. 我可以说会有两个小计吗,第一个按FACT_1_ID, FACT_2_ID分组,另一个按FACT_1_ID, FACT_3_ID分组?

  2. 1的GROUPING_ID指的是group by FACT_1_ID, FACT_2_ID?而 2 的 GROUPING_ID 指的是按 FACT_1_ID, FACT_3_ID?

  3. 分组
  4. 从第 2 点开始继续。由于 1 的 GROUPING_ID 指的是按 FACT_1_ID, FACT_2_ID 分组,因此列 FACT_3_ID 保持原样 NULL未用作 GROUP BY 子句。

我的理解正确吗?

GROUPING_ID就是用这个公式计算出来的。 BIN_TO_NUM(grouping(fact_1_id),GROUPING(fact_2_id),GROUPING(fact_3_id))

Bin_to_num 将二进制值转换为数字。
可以进行逆向计算。
如果 GROUPING_ID=1 => BIN_TO_NUM(0,0,1) = 1 -> fact_3 = null
如果 GROUPING_ID=2 => BIN_TO_NUM(0,1,0) = 2 ->fact_2 = null
“1”的位置表示分组时哪一列被null替换了。
看得懂吗?