12
votes

Effectuer une somme bitwise

Dans le cadre d'un agrégat complexe, je souhaite connaître la somme Bitwise la somme de certaines données, c'est-à-dire si j'ai des lignes avec des valeurs 1,1,1,2,2,8 le Bittwise la somme est de 11. Dans ce cas, les valeurs sont toutes des pouvoirs exacts de deux (bits simples), de sorte que je puisse pirater de la sorte en regroupant et en résumé sur les groupes (évidemment cet exemple est un peu torturé par rapport à la vraie requête ): xxx

mais y a-t-il un moyen propre pour effectuer une somme des bits dans [t] SQL?


2 commentaires

Marc, tu parles essentiellement d'oring toutes ces valeurs? Ou voulez-vous dire enlever les doublons d'abord, puis ajouter (pas sûr d'utiliser le terme bitwise pour cela)?


@paxdiablo les deux; Bitwise ou sur l'ensemble serait identique à un ajout unique, car chacun est une puissance absolue de 2


4 Réponses :


1
votes

vous avez l'opérateur | qui effectue un bitwise ou pour 2 opérandes. Il est possible de résoudre votre problème à l'aide d'un curseur et de cet opérateur.

éditer oui j'ai mélangé et et, fixé.


0 commentaires

3
votes

C'est un peu compliqué, mais cela fait ce que vous êtes après (Notez que Ive Inclus de bit jusqu'à 128, vous devrez peut-être aller plus haut, ou peut ne pas avoir besoin d'aller plus haut de 8).

with data(i)
AS
(
    select 1 
        union all select 1
        union all select 1
        union all select 2
        union all select 2
        union all select 8
)
SELECT MAX(i & 1) +
MAX(i & 2) +
MAX(i & 4) +
MAX(i & 8) +
MAX(i & 16) +
MAX(i & 32) +
MAX(i & 64) +
MAX(i & 128)
from data


1 commentaires

J'essaie de comprendre comment convertir cela en UDF. Pourriez-vous préciser ceci?



19
votes

Si toutes vos valeurs de test sont des bits simples comme dans votre exemple (1, 2, 8) - utilisez simplement somme (Colon distinct) dans votre requête.

espère que cela aide.

(pour référence: http://msdn.microsoft.com/en-us/library/ms187810 .aspx )


0 commentaires

0
votes

Pour les bits simples La somme (Col distincte) est la meilleure réponse, mais pour plusieurs bits tels que 3 (= 1 | 2) cela ne fonctionne pas et la meilleure réponse plus rapide serait comme suit:

Sélectionner la somme (x.text distincte et t.b) À partir de X Croix JOIN (valeurs (1), (2), (4), (8), (16), (32), (64), (128), (256), (512), (512)) T (B)


0 commentaires