【发布时间】:2013-02-19 14:57:45
【问题描述】:
技术情况:
Given 是 SQL Server 2008 R2 中的 int 列,用于保存十进制“编码”位标志(范围从 20 到 230,因此有 31 个可用标志,最大值为 1073741824)。此列可能包含可分配整数组合的整个范围,全部用于对单个对象进行分类。
待解决的问题:
从有限数量的十进制“位整数”中,我们必须找到一个代表所有这些标志的某种交集的数字——
比如你有3,10,524290,很明显2应该设置在结果中,而其他位(1,8,524288)是有争议的。这是一个非常基本的例子。这可能是一组真实的输入数据(仅前两列):
目前的解决方案:
…在 Transact-SQL 中实现:
- 收集所有要计算的整数并将它们连接成一个逗号分隔的字符串。
- 减少字符串,取出第一个数字,循环遍历:
- 对照最大值 (
&-AND) 检查受测者并将最大值除以 2(而>=1)。
……到目前为止? ó.Ò
现在我有一个二进制代表的比特集的输出。我考虑将这些位保存到一个 31 列的临时表中,以便进行评估。但后来我开始想:难道没有更聪明的方法来做到这一点吗? SQL Server 速度超快,即使在反汇编 10000 个生成的整数时也是如此。但也许有一个内置函数可以计算两个二进制位标志之间的“距离”。
我承认这是一个复杂的问题,但我真的确实看到了隧道尽头的曙光,即使它需要以间接的方式完成。它会变得更加复杂,因为稍后还应该应用加权,因此 2× ¬00010000 @ 100% 显着性> 4× 00010000 @ 40% 显着性。但是,当我生成并提供摘要时,我会尝试处理这个问题
【问题讨论】:
标签: sql-server bit-fields