技術的な状況:
SQL Server 2008 R2には、10 進数で「エンコードされた」ビット フラグ (2 0から 2 30の範囲で、最大で 31 個のフラグが使用可能) を保存するためのint
列があります。この列は、単一のオブジェクトを分類するために、割り当て可能な整数の組み合わせの全範囲を含む場合があります。1073741824
解決すべき問題:
有限個の 10 進数の「ビット整数」から、これらすべてのフラグの何らかの交点を表す単一の数値を見つける3,10,524290
必要2
があります1,8,524288
。議論の余地があります。これは非常に基本的な例です。これは、入力データの実際のセットである可能性があります (最初の 2 列のみ)。
オカレンス | 10 進ビット フィールド | バイナリ表現 7 | 268435460 | 1000000000000000000000000100 5 | 268435488 | 10000000000000000000000100000 5 | 128 | 00000000000000000000010000000 4 | 32 | 00000000000000000000000100000 3 | 4 | 0000000000000000000000000100 3 | 268435492 | 10000000000000000000000100100 2 | 36 | 00000000000000000000000100100 2 | 132 | 00000000000000000000010000100 1 | 160 | 00000000000000000000010100000 特定のビットの出現: 3--------------------3-6--6-- 希望の出力可能性: 1000000000000000000000100100
これまでの解決策:
… Transact-SQL で実装:
- 評価するすべての整数を収集し、それらをコンマ区切りの文字列に連結します。
- 文字列を減らし、最初の数字を取り出し、ループします:
- testee を最大値 (
&-AND
) と照合し、最大値を 2 で割る (while>=1
)。
… これまでのところ?ó.Ò
これで、ビット セットのバイナリ表現の出力が得られました。これらのビットを 31 列の一時テーブルに保存して、評価を行うことを検討します。しかし、私は考えるようになりました:これを行うためのより賢い方法はありませんか? SQL Server は、生成された 10000 個の整数を逆アセンブルする場合でも超高速です。しかし、2 つのバイナリ ビット フラグ間の「距離」を計算するための組み込み関数があるかもしれません。
複雑な問題であることは認めますが、状況に応じた方法で実行する必要がある場合でも、トンネルの終わりに光が見えます. 00010000
2× ¬ @ 100% の有意性> 4× 00010000
@ 40% の有意性となるように、重み付けも後で適用する必要があるため、さらに複雑になります。しかし、要約が生成されて利用可能になったら、これに対処しようとします