当前位置: 首页 > 面试题库 >

T-SQL中的汉明重量/人口计数

苗盛
2023-03-14
问题内容

我正在寻找一种计算BINARY(1024)字段的汉明权重/人口计数/“ 1位数”的 快速
方法。MySQL有一个类似的BIT_COUNT函数。我在T-SQL中找不到类似的功能?

还是建议将二进制数据存储在其他类型的字段中?

如果您不知道我在说什么,这是Wikipedia上有关海明重量的文章。


问题答案:

您可以使用具有预先计算的汉明权重的助手表来获取较小的数字(例如字节),然后相应地拆分值,加入助手表并获得部分汉明权重之和作为该值的汉明权重:

-- define Hamming weight helper table
DECLARE @hwtally TABLE (byte tinyint, hw int);
INSERT INTO @hwtally (byte, hw) VALUES (0, 0);
INSERT INTO @hwtally (byte, hw) SELECT   1 - byte, 1 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT   3 - byte, 2 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT   7 - byte, 3 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  15 - byte, 4 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  31 - byte, 5 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  63 - byte, 6 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT 127 - byte, 7 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT 255 - byte, 8 - hw FROM @hwtally;

-- calculate
WITH split AS (
  SELECT SUBSTRING(@value, number, 1) AS byte
  FROM master.dbo.spt_values
  WHERE type = 'P' AND number BETWEEN 1 AND LEN(@value)
)
SELECT
  Value = @value,
  HammingWeight = SUM(t.hw)
FROM split s
  INNER JOIN @hwtally t ON s.byte = t.byte


 类似资料:
  • 问题内容: 不知道如何问这个问题,我不是在寻找列中值的总数,而是想递增地计算重复值。例如: 如果我的桌子看起来像这样: 我想在选择期间添加一列,以重复的方式将标签重复,如下所示: 问题答案: 你可以通过做一个关于你的第二列,由第一顺序:

  • 问题内容: 我在数据库中有一个表,其中将SHA256哈希存储在BINARY(32)列中。我正在寻找一种计算列中条目到提供值的汉明距离的方法,例如: (如果您想知道,字符串A和B的汉明距离定义为,其中^是按位XOR运算符,而BIT_COUNT返回二进制字符串中1的数目)。 现在,我知道^运算符和BIT_COUNT函数都只能在INTEGER上使用,所以我想说,唯一的方法是将子字符串中的二进制字符串分解

  • 问题内容: 我有一个包含字段()的表()。我想从中选择每一行,以及表中该字段与相同的行数。 如何在SQL中完成? (像这样的伪SQL: ) 问题答案:

  • 这个查询有效 但我想把表作为变量传递,在sybase中如何实现? 我试过这个但没有用 编辑: 是我干的 不允许从数据类型“VARCHAR”隐式转换为“NUMERIC”。使用CONVERT函数运行此查询。

  • 问题内容: 我有一个简单的表,其中包含一些虚拟数据设置: 我可以通过执行以下sql(MSSQL 2008)语句来选择运行总计: 这将给我如下结果: 现在可以只为每个用户检索最新的行吗?因此结果将是: 我要这样做正确吗?任何建议或遵循的新路径都将是很棒的! 问题答案: 试试这个: SQL小提琴演示

  • 问题内容: 我在需要转换为SQL Server的旧报表中遇到了这一行。 ExamCodes是源代码,而learninger_code是模式。我知道SQL Server没有REGEXP_LIKE,大多数地方都告诉您使用PATINDEX。 我在想这会起作用: 但是我得到了错误: 在MSDN上,语法指定为 但是learninger_code是一个字段,我无法指定模式吗? 我最初没有写此报告,所以我还是对