我不太明白这个功能是如何工作的,我一直在查看下面的文档,我有一些问题。
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。
答案 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(十进制)