GROUPING_ID

GROUPING 函数生成的布尔值集连接到位向量。 GROUPING_ID 将位向量作为二进制数字进行处理,并将其作为可以确认分组集组合的十进制值返回。

通过使用 GROUPING_ID,不再需要多个单独的 GROUPING 函数。 GROUPING_ID 可以简化行筛选条件,因为使用 GROUPING_ID = n 的单一返回来确定感兴趣的行。使用 GROUPING_ID 确定分组组合。

行为类型

不可变

语法

GROUPING_ID ( [expression[,...] )
表达式
匹配 GROUP BY 子句中表达式之一的表达式。

如果 GROUP BY 子句包含表达式列表,GROUPING_ID 将会返回一个与关联到行的 GROUPING 位向量对应的数字。

示例

此示例显示如何调用 GROUPING_ID,示例中不使用返回与完整的多级别聚合表达式集关联的 GROUPING 位向量的表达式。GROUPING_ID 值与 GROUPING_ID(a,b) 差不多,因为 GROUPING_ID() 包括 GROUP BY ROLLUP 中的所有列:

=> SELECT a,b,COUNT(*), GROUPING_ID() FROM T GROUP BY ROLLUP(a,b);

在以下查询中,GROUPING(Category)GROUPING(Year) 列具有三个组合:

  • 0,0

  • 0,1

  • 1,1

=> SELECT Category, Year, SUM(Amount),
   GROUPING(Category), GROUPING(Year) FROM expenses
   GROUP BY ROLLUP(Category, Year) ORDER BY Category, Year, GROUPING_ID();
  Category   | Year |  SUM   | GROUPING | GROUPING
-------------+------+--------+----------+----------
 Books       | 2005 |  39.98 |        0 |        0
 Books       | 2007 |  29.99 |        0 |        0
 Books       | 2008 |  29.99 |        0 |        0
 Books       |      |  99.96 |        0 |        1
 Electricity | 2005 | 109.99 |        0 |        0
 Electricity | 2006 | 109.99 |        0 |        0
 Electricity | 2007 | 229.98 |        0 |        0
 Electricity |      | 449.96 |        0 |        1
             |      | 549.92 |        1 |        1

GROUPING_ID 按照以下方式转换这些值:

二进制集值
十进制对等值
00
0
01
1
11
3
0
类别, 年份

以下查询返回 gr_id 列中显示的针对每个 GROUP BY 级别的单个数字:

=> SELECT Category, Year, SUM(Amount),
   GROUPING(Category),GROUPING(Year),GROUPING_ID(Category,Year) AS gr_id
   FROM expenses GROUP BY ROLLUP(Category, Year);
  Category   | Year |  SUM   | GROUPING | GROUPING | gr_id
-------------+------+--------+----------+----------+-------
 Books       | 2008 |  29.99 |        0 |        0 |     0
 Books       | 2005 |  39.98 |        0 |        0 |     0
 Electricity | 2007 | 229.98 |        0 |        0 |     0
 Books       | 2007 |  29.99 |        0 |        0 |     0
 Electricity | 2005 | 109.99 |        0 |        0 |     0
 Electricity |      | 449.96 |        0 |        1 |     1
             |      | 549.92 |        1 |        1 |     3
 Electricity | 2006 | 109.99 |        0 |        0 |     0
 Books       |      |  99.96 |        0 |        1 |     1

gr_id 值决定了每一行的 GROUP BY 级别:

GROUP BY 级别
GROUP BY 行级别
3
总计
1
类别
0
类别, 年份

您也可以通过单独比较每个搜索值,使用 DECODE 函数赋予这些值更多的含义。

=> SELECT Category, Year, SUM(AMOUNT), DECODE(GROUPING_ID(Category, Year),
       3, 'Total',
       1, 'Category',
       0, 'Category,Year')
   AS GROUP_NAME FROM expenses GROUP BY ROLLUP(Category, Year);
  Category   | Year |  SUM   |  GROUP_NAME
-------------+------+--------+---------------
 Electricity | 2006 | 109.99 | Category,Year
 Books       |      |  99.96 | Category
 Electricity | 2007 | 229.98 | Category,Year
 Books       | 2007 |  29.99 | Category,Year
 Electricity | 2005 | 109.99 | Category,Year
 Electricity |      | 449.96 | Category
             |      | 549.92 | Total
 Books       | 2005 |  39.98 | Category,Year
 Books       | 2008 |  29.99 | Category,Year

另请参阅