GROUPING_ID功能

时间:2014-11-07 12:08:31

标签: sql-server tsql

我不太明白这个功能是如何工作的,我一直在查看下面的文档,我有一些问题。

http://msdn.microsoft.com/en-us/library/bb510624.aspx

所以,我理解GROUPING()如何完美地运作,但是GROUPING_ID的输出对我来说完全不可能理解,因为它与解释不一样。

例如,我有以下字符串的1和0:010。在文档中,它说它等于2.另外,我在一本SQL书中读到每个字节(最右边)is EQUAL,其中2位于字节位置的幂减去1。

那么,(2 ^ 2 - 1)+(2 ^ 1 - 1)+(2 ^ 0 - 1),但每个二进制数不一样吗? (100 / 101/110 /等),结果也不是2 ....

编辑1: 这就是本书的解释如下:

  

可用于识别分组集的另一个功能是GROUPING_ID。这个   function接受分组列的列表作为输入,并返回表示a的整数   位图。最右边的位代表最右边的输入。各个元素的位为0   是分组集的一部分,而不是分组集的一部分。每个位表示2次上升到功率   位位减1;所以最右边的位代表1,左边的那个代表2,然后代表4,   然后8,依此类推。结果整数是表示元素的值的总和   不属于分组集,因为它们的位已打开。这是一个展示的查询   使用这个功能。

必须有一个错误,因为2 ^(位置) - 1无法计算数字,这是一个错误吗?我一直用2 ^(位置)* 1计算,输出是正确的。 例如,我已经完成了这个

GROUPING_ID(a,b,c),
GROUPING(a),
GROUPING(b),
GROUPING(c)

让我们说我们有以下输出

3, 0, 1, 1

所以我们的二进制字符串是011,3是GROUPING_ID函数的输出,如果我们计算字符串

2^0 * 1 + 2^1 * 1 + 2^0 *2 = 1 + 2 + 0 = 3

我在这里看不到其他逻辑,我不能用负数来计算,因为上面的引用说,问题是在MSDN上,奇怪的定义似乎与此类似:

  

每个GROUPING_ID参数必须是GROUP BY列表的元素。 GROUPING_ID()返回一个整数位图,其最低N位可能会被点亮。

     

亮起的位表示相应的参数不是给定输出行的分组列。最低位对应于自变量N,第N-1最低位对应于自变量1。

2 个答案:

答案 0 :(得分:3)

首先,当他们说

  

每个位表示2位上升到位位置减去1

的幂

他们不是2position - 1而是2position - 1。显然,出于描述的目的,他们选择从1(最右边的位)而不是从0开始计数位。

其次,每个位代表设置时的值,即当它为1.所以,当然,你不会只做

21 - 1 + 22 - 1 + ... + 2N - 1

而是

bit1 × 21 - 1 + bit2 × 22 - 1 + ... + bitN × 2N - 1

这是将二进制表示转换为十进制表示的常规方法,也是您在问题结尾附近显示的方法。

答案 1 :(得分:1)

假设我们有二进制数0101 我们从右到左

1→(2 ^ 0 * 1)= 1

0→(2 ^ 1 * 0)= 0

1→(2 ^ 2 * 1)= 4

0→(2 ^ 3 * 0)= 0

如果我们总结所有结果,我们有5

所以0101(二进制)= 5(十进制)