【问题标题】:Bitwise operation in Group ByGroup By 中的按位运算
【发布时间】:2020-07-23 05:51:32
【问题描述】:

我必须在 group by 查询中使用按位运算,但我什么也没找到。

表:

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

【问题讨论】:

  • 还是不明白你是怎么得到结果的
  • 4(00000100) OR 8(00001000) OR 5(00000101) = 13(00001101) 我想对分组值进行按位运算

标签: sql-server group-by bit-manipulation operation


【解决方案1】:

你的问题变得非常有趣。

创建此函数(您可能需要重新考虑名称)

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

现在你可以运行这个脚本了,我正在使用一个表变量,用你的表替换它:

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

【讨论】:

  • 如果有人需要处理位掩码值可能为0 的情况,则必须将CROSS APPLY 替换为OUTER APPLY,并且总和必须包含在ISNULL 中:ISNULL(SUM(distinct t2.Value), 0) Total
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多