GROUPING_ID
将 GROUPING 函数生成的布尔值集连接到位向量。 GROUPING_ID
将位向量作为二进制数字进行处理,并将其作为可以确认分组集组合的十进制值返回。
通过使用 GROUPING_ID
,不再需要多个单独的 GROUPING 函数。 GROUPING_ID
可以简化行筛选条件,因为使用
GROUPING_ID = n
的单一返回来确定感兴趣的行。使用 GROUPING_ID
确定分组组合。
行为类型
不可变语法
GROUPING_ID ( [expression[,...] )
- 表达式
- 匹配
GROUP B
Y 子句中表达式之一的表达式。如果
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