1 つのバイナリ列を持つテーブルがあります。0x00010100000101010101......00 列のデータ長が 35040 を含む、このデータを次のように準備します
@Jobbyte = COALESCE(@Jobbyte , 0x) + Cast ((Case When Sum(A.bit) >= 1 then 1 else 0 end)as binary(1))
このバイナリ データを別のバイナリ データと比較し、一致するバイナリ カウントを取得する必要があります。両方のバイナリ データのデータの長さが等しい
下の画像を見てください。Binary1 と Binary2 の 2 つのバイナリ データです。両方のバイナリ データを比較し、一致するバイナリ データの合計を取得したいと考えています。唯一の条件は、binary2 のシングル ビットが 0x01 の場合です。
最後の行は、0 = 一致しない、1 = 一致し、最後の列は最後の行の合計であることを示します (4) 比較する方法を教えてください。クエリを投稿できるとよいでしょう。
更新 1
私は2つの関数を使用して解決しようとしていますが、10000レコードで実行すると時間がかかり、1レコードの実行時間は50ミリ秒です
Create FUNCTION [dbo].[Fn_BinaryToTable]
(
@BinaryData VARBINARY(max)
)
RETURNS TABLE
AS
RETURN
(
Select ((N.Number / 96) - (Case (N.Number % 96) when 0 Then 1 else 0 end))+1 As [FNNoDay],
(Case (N.Number % 96) when 0 then 96 else (N.Number % 96) end) * 15 AS [FnMinutes],
SUBSTRING(@BinaryData,(N.Number),1) AS [FNBIT]
from Numbers N
Where N.Number between 1 and (DATALENGTH(@BinaryData))
)
---------------------------------------------------------
Create FUNCTION [dbo].[fn_GetPercentage]
(
@JobValue int,
@CandidateBinary VARBINARY(max),
@JobBinary VARBINARY(max)
)
RETURNS Decimal
AS
BEGIN
DECLARE @RValue Decimal;
SELECT @RValue = SUM(cast(JB.FNBIT as int))
FROM dbo.Fn_BinaryToTable(@CandidateBinary) CB,
dbo.Fn_BinaryToTable(@JobBinary) JB
WHERE CB.FNNoDay = JB.FNNoDay
AND CB.FnMinutes = JB.FNMinutes
AND JB.FNBIT = CB.FNBIT
AND JB.FNBIT = 0x01
Return ((@RValue * 100)/ @JobValue);
END
--------------------------------------------------------
Declare @Jobbyte varbinary(max);
Declare @JobValue int;
Select @Jobbyte = JobBinary from Job;
Select @JobValue = count(*) from dbo.Fn_BinaryToTable(@Jobbyte) Where FNBIT = 0x01
----Select @JobValue = Sum(Cast(FNBIT as int)) from dbo.Fn_BinaryToTable(@Jobbyte)
set statistics time on
set statistics io on
select cid,dbo.fn_GetPercentage(@JobValue,cal,@Jobbyte) from eCal
set statistics time oFF
set statistics io oFF
----------------------------------------------------------
- Numbers テーブルには、1 ~ 99999 の値を含む int フィールドが 1 つだけ含まれています。
- 1 日 15 分間隔で 96 回使用 (24* (60/15))