Đây là một sự thay thế, mà không VỚI (tiếng hoan hô!!!):
select sum(distinct isnull(n & BitMask, 0)) as resultvalue
from
(
SELECT 1 AS n
UNION ALL
SELECT 2
UNION ALL
SELECT 4
UNION ALL
SELECT 3
) t
INNER JOIN (SELECT 0 BitMask union all SELECT 1 union all SELECT 2 union all SELECT 4 union all SELECT 8 union all SELECT 16 union all SELECT 32 union all SELECT 64 union all SELECT 128 union all SELECT 256 union all SELECT 512 union all SELECT 1024 union all SELECT 2048 union all SELECT 4096 union all SELECT 8192 union all SELECT 16384 union all SELECT 32768 union all SELECT 65536) Bits -- = SELECT POWER(2, 16)
ON n & BitMask = BitMask;
Cũng xem xét một Nhóm By dụ:
-- Setup temp table to produce an example --
create table #BitValues
(
id int identity(1,1)
,value int
,groupby varchar(10)
)
insert into #BitValues
SELECT 1 AS value, 'apples'
UNION ALL
SELECT 2, 'apples'
UNION ALL
SELECT 4, 'apples'
UNION ALL
SELECT 3, 'apples'
-- Bit operation: --
select groupby, sum(distinct isnull(value & BitMask, 0)) as tempvalue
from #BitValues
INNER JOIN (SELECT 0 BitMask union all SELECT 1 union all SELECT 2 union all SELECT 4 union all SELECT 8 union all SELECT 16 union all SELECT 32 union all SELECT 64 union all SELECT 128 union all SELECT 256 union all SELECT 512 union all SELECT 1024 union all SELECT 2048 union all SELECT 4096 union all SELECT 8192 union all SELECT 16384 union all SELECT 32768 union all SELECT 65536) Bits -- = SELECT POWER(2, 16)
ON value & BitMask = BitMask
group by groupby
Ví dụ đầu tiên được hiểu là chậm hơn so với VỚI. Tuy nhiên, khi bạn sử dụng GroupBy với một số dữ liệu khác, các truy vấn chủ yếu là chi phí khôn ngoan.
Một cách khác để làm điều này là
select
groupby
,max(case when n & 1 = 1 then 1 else 0 end)
+
max(case when n & 2 = 2 then 2 else 0 end)
+
max(case when n & 4 = 4 then 4 else 0 end)
+
max(case when n & 8 = 8 then 8 else 0 end)
+
max(case when n & 16 = 16 then 16 else 0 end)
+
max(case when n & 32 = 32 then 32 else 0 end)
+
max(case when n & 64 = 64 then 64 else 0 end)
+
max(case when n & 128 = 128 then 128 else 0 end)
+
max(case when n & 256 = 256 then 256 else 0 end)
+
max(case when n & 512 = 512 then 512 else 0 end)
+
max(case when n & 1024 = 1024 then 1024 else 0 end)
as NewDNC
from #BitValues
group by groupby;
Đó là một chút tồi tệ hơn vì sự lặp lại trong mã, nhiều hơn một chút có thể đọc được và tương tự ở chi phí thực hiện.
Nguồn
2016-03-04 17:12:13
Kế hoạch thực hiện điều này có vẻ tốt hơn một chút so với giải pháp của @ Andomar. Có lẽ ai đó có thể giải mã tốt hơn kế hoạch thực hiện có thể cân nhắc. – Daniel
Khi tôi chạy giải pháp này và @ Andomar trong cùng một lô, đó là 44% của lô. – Daniel
+1 Mặc dù cái này chỉ hỗ trợ 4 bit, nhưng nó nhanh hơn vì nó thực hiện một 'phép nối bán trái' mà không có một' phân loại riêng biệt'. Đã chỉnh sửa truy vấn của tôi để thực hiện tương tự. Mát mẻ. :) – Andomar