Как сгруппировать T-SQL, установленный в столбце флажка bigint - PullRequest
0 голосов
/ 25 июня 2018

Я работаю над проектом, в котором эффективность функции поиска имеет решающее значение.

У меня есть несколько столбцов флагов (например, флаги enum в c #).Поиск по этим данным очень быстрый (3 миллисекунды туда и обратно), но я пришел в себя, теперь мне нужно выполнить подсчет групп.

Итак, у меня есть элемент 'A', содержащий красный (1), Белый (8) и синий (64), поэтому столбец «Цвета» содержит число 73.

Для поиска я могу искать элементы с красным с помощью этого

Declare @colour int
set @colour = 1

Select * 
From Items  
Where (Colour & @colour) > 0

Это работаетотличный.Теперь я должен сгруппировать его (также очень быстро)

Итак, если у меня всего 8 элементов, 5 содержат красный, 3 содержат белый и 7 содержат синий, результат будет выглядеть следующим образом:

Colour      Qty
------------------
1           5
8           3
64          7 ( I don't have to worry about the name )

Итак: есть ли способ, которым я могу взять число 73 и поразрядно разделить его на группы?

(Часть 2: Как мне перевести это в Linq для SQL?)

Любой советбыл бы признателен

Спасибо ^ _ ^

1 Ответ

0 голосов
/ 25 июня 2018

Хорошо - я думаю, что я разработал лучшее решение:

Я пробовал просмотр с помощью cte:

with cte as (
  select cast(1 as bigint) as flag, 1 pow
  union all
  select POWER(cast(2 as bigint),pow), pow + 1
  from cte
  where flag < POWER(cast(2 as bigint),62)
)
, cte2 as (
  select flag from cte
  union select -9223372036854775808
)

но это было слишком медленно, так что теперь я превратил это в статическую таблицу. Я присоединяюсь с побитовым '&':

select Flag, Count(*)
From FlagValues fv 
inner join Items i on (fv.Flag & i.Colour)

намного быстрее ^ _ ^

...