Group By 中的位运算
Bitwise operation in Group By
我必须在 group by
查询中使用按位运算,但我没有找到任何东西。
Table:
PermissionId, BitMask(BigInt)
1, 4
2, 7
1, 8
1, 5
我想要的结果是:
1, 13
2, 7
如何在 T-SQL 中编写如下脚本
SELECT PermissionId, BIT_OR(BitMask)
FROM table
GROUP BY PermissionId
你的问题变得很有趣。
创建此函数(您可能需要重新考虑名称)
CREATE function f_test
(
@param bigint
)
returns @t table (value bigint)
AS
BEGIN
;WITH CTE AS
(
SELECT
@param % 2 value,
1 multiplier,
@param / 2 remain
UNION ALL
SELECT
remain % 2,
multiplier * 2,
remain / 2
FROM
CTE
WHERE
remain > 0
)
INSERT @t
SELECT multiplier
FROM CTE
WHERE value = 1
RETURN
END
现在你可以运行这个脚本了,我用的是table变量,把它换成你的table:
DECLARE @t table(PermissionId int, BitMask bigint)
INSERT @t values(1,4),(2,7),(1,8),(1,5)
SELECT
t1.PermissionId,
SUM(distinct t2.Value) Total
FROM
@t t1
CROSS APPLY
f_test(t1.BitMask) t2
GROUP BY
t1.PermissionId
结果:
PermissionId Total
1 13
2 7
我必须在 group by
查询中使用按位运算,但我没有找到任何东西。
Table:
PermissionId, BitMask(BigInt)
1, 4
2, 7
1, 8
1, 5
我想要的结果是:
1, 13
2, 7
如何在 T-SQL 中编写如下脚本
SELECT PermissionId, BIT_OR(BitMask)
FROM table
GROUP BY PermissionId
你的问题变得很有趣。
创建此函数(您可能需要重新考虑名称)
CREATE function f_test
(
@param bigint
)
returns @t table (value bigint)
AS
BEGIN
;WITH CTE AS
(
SELECT
@param % 2 value,
1 multiplier,
@param / 2 remain
UNION ALL
SELECT
remain % 2,
multiplier * 2,
remain / 2
FROM
CTE
WHERE
remain > 0
)
INSERT @t
SELECT multiplier
FROM CTE
WHERE value = 1
RETURN
END
现在你可以运行这个脚本了,我用的是table变量,把它换成你的table:
DECLARE @t table(PermissionId int, BitMask bigint)
INSERT @t values(1,4),(2,7),(1,8),(1,5)
SELECT
t1.PermissionId,
SUM(distinct t2.Value) Total
FROM
@t t1
CROSS APPLY
f_test(t1.BitMask) t2
GROUP BY
t1.PermissionId
结果:
PermissionId Total
1 13
2 7